为什么我的程序输出不断变化?EAX寄存器不断更改值
Why does the output of my program keep changing? EAX register keeps changing value?
我写了一个程序来查找最大递增序列的长度,给定较大的array
(array
在 c++ 中初始化,c++ main 调用该过程(,我编译了代码,但是,程序的输出不断变化?
我尝试替换和观察寄存器,它们似乎对程序输出根本没有影响。
最后,我尝试删除过程中会影响ret
的所有指令(返回EAX
(,但是,程序仍然在控制台上输出随机整数
Sequence.asm (.asm file)
.586
.MODEL flat,C
.data
.code
longestSequence PROC USES eax ebx esi edi ,theArrayOFFSET: PTR DWORD,theArraySize: DWORD
LOCAL temp[10]: DWORD
LOCAL lengthc: DWORD
LOCAL k: DWORD
LOCAL temp1: DWORD
LOCAL temp2: DWORD
//the algorithm to find the longest sequence of integer should be here, but its not shown for simplicity and the program still output random integers
*
*
*
mov eax,8 //suppose I move 8 into eax, it still generates random output
ret
longestSequence ENDP
END
Class ConsoleApplication3(cpp file)
#include "pch.h"
#include <iostream>
extern "C" int longestSequence(int array[], unsigned count);
int main()
{
int array1[10] = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 };
int seq;
seq = longestSequence(array1, 10);
cout << seq << endl;
return 0;
}
每次程序运行时,输出都会有所不同,例如:第一次运行 - 7338264
第二轮 - 19920684
应4
正确的array1 = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 };
输出,因为最长序列的长度4
{14,17,26,42}
PROC USES eax
会导致 MASM 生成序言代码,在函数开始时将eax
保存在堆栈上,以及尾声代码,在每次ret
之前恢复其原始值。这将删除您在退出函数之前在eax
中准备的任何值。
换句话说,你的
mov eax,8
ret
在实际翻译成
mov eax,8
pop edi
pop esi
pop ebx
pop eax
leave
ret
(在调用代码中eax
可能用于临时存储某个地址值。地址空间随机化会导致它从一个会话更改为另一个会话,这就是随机化您观察到的值的原因。
从列表中删除eax
USES
。
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 为什么我的程序输出不断变化?EAX寄存器不断更改值
- 将EAX寄存器存储在变量中
- 是带有 RAX/EAX/AX/AL/AH 寄存器作为目的地的携带速度更快的补充
- 读取eax寄存器