我编写了一个程序来查找给定更大的数组
的最大递增序列的长度(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
array1 = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 };
的正确输出应该是 4
因为对于{14,17,26,42}
4
最佳答案
PROC USES eax
导致 MASM 生成保存 eax
的序言代码在函数开始时在堆栈上,以及在每个 ret
之前恢复其原始值的尾声代码.这会抹掉您在 eax
中准备的任何值在退出函数之前。
换句话说,你的
mov eax,8
ret
in实际翻译成
mov eax,8
pop edi
pop esi
pop ebx
pop eax
leave
ret
(在调用代码中 eax
可能用于临时存储一些地址值。地址空间随机化导致它从一个 session 更改为另一个 session ,这就是随机化您观察到的值的原因。)
删除 eax
来自 USES
列表。
关于c++ - 为什么我的程序的输出不断变化? EAX寄存器不断改变值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56535503/