我编写了一个程序,在给定较大的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
第2次运行-19920684
array1 = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 };
的正确输出应该是4
,因为4
的最长序列的长度是{14,17,26,42}
答案 0 :(得分:3)
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
。