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

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

本文关键字:寄存器 EAX 变化 我的 程序 输出 为什么      更新时间:2023-10-16

我写了一个程序来查找最大递增序列的长度,给定较大的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第二轮 - 19920684

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

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