为什么我的程序的输出不断变化?EAX寄存器不断更改值? 编写了一个程序,求出最大的递增序列的长度,给定一个较大的数组< /C>(在C++中初始化数组/,C++主调用程序),我编译了代码,但是程序的输出保持不变?p>
我试着更换和观察寄存器,它们似乎对程序输出没有任何影响 最后,我尝试删除过程中影响为什么我的程序的输出不断变化?EAX寄存器不断更改值? 编写了一个程序,求出最大的递增序列的长度,给定一个较大的数组< /C>(在C++中初始化数组/,C++主调用程序),我编译了代码,但是程序的输出保持不变?p>,c++,assembly,x86,masm,C++,Assembly,X86,Masm,我试着更换和观察寄存器,它们似乎对程序输出没有任何影响 最后,我尝试删除过程中影响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
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
类控制台应用程序3(cpp文件)
#包括“pch.h”
#包括
外部“C”int longestSequence(int数组[],无符号计数);
int main()
{
int array1[10]={-5,10,20,14,17,26,42,22,19,5};
内部顺序;
seq=最长的序列(array1,10);
coutPROC使用eax
使MASM在函数开始时生成在堆栈上保存eax
的序言代码,以及在每次ret
之前恢复其原始值的尾声代码。这将删除退出函数之前在eax
中准备的任何值
换句话说,你的
mov eax,8
ret
实际上翻译成
mov eax,8
pop edi
pop esi
pop ebx
pop eax
leave
ret
(在调用代码中,eax
可能用于临时存储某个地址值。地址空间随机化会导致它从一个会话更改为另一个会话,这就是将观察到的值随机化的原因。)
从USES
列表中删除eax
。这就是为什么当事情变得奇怪时,使用调试器单步执行机器代码而不是asm源代码是一个好主意。特别是当使用为您发出任何额外asm指令的工具时。
mov eax,8
pop edi
pop esi
pop ebx
pop eax
leave
ret