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

时间:2019-06-11 02:02:13

标签: c++ assembly x86 masm

我编写了一个程序,在给定较大的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}

1 个答案:

答案 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