为什么我的程序的输出不断变化? EAX寄存器不断改变价值?

Why does the output of my program keep changing? EAX register keeps changing value?

我写了一个程序来求给定一个更大的array的最大递增序列的长度(array是在c++中初始化的,c++ main调用这个过程),我得到了代码编译,但是,程序的输出不断变化?

我尝试更换并观察寄存器,它们似乎对程序输出根本没有影响。

最后,我尝试删除程序中所有会影响ret(returns 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;
}

每次程序 运行s 的输出都不同,例如: 第一 运行 - 7338264 第二 运行 - 19920684

array1 = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 }; 的正确输出应该是 4 因为最长序列的长度是 4 {14,17,26,42}

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 可能用于临时存储一些地址值。地址 space 随机化导致它从一个会话更改为另一个会话,这就是随机化您的值观察。)

USES 列表中删除 eax