Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的程序的输出不断变化?EAX寄存器不断更改值? 编写了一个程序,求出最大的递增序列的长度,给定一个较大的数组< /C>(在C++中初始化数组/,C++主调用程序),我编译了代码,但是程序的输出保持不变?p>_C++_Assembly_X86_Masm - Fatal编程技术网

为什么我的程序的输出不断变化?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);

cout
PROC使用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