c++ - 为什么我的程序的输出不断变化? EAX寄存器不断改变值(value)?

标签 c++ assembly x86 masm

我编写了一个程序来查找给定更大的数组的最大递增序列的长度(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/

相关文章:

c++ - Visual Studio 2017 C++ 项目中的 Libavcodec "the procedure entry point for av_frame_alloc could not be located"错误

c - 为什么 "noreturn"函数返回?

c++ - 在没有任何构造函数的类的情况下,C++11 中自动生成的类成员函数

c++ - 编写编译器 : how to get simple templates to work?

assembly - mov 立即数到 64 位寄存器的十六进制机器代码没有 REX.W 前缀?

操作数后应有逗号、冒号、修饰符或行尾

c++ - 这些锁定的内存访问是否等效?

linux - x86 程序集 : Before Making a System Call on Linux Should You Save All Registers?

c++ - 避免 dynamic_cast/RTTI

c++ - 高效的 SSE NxN 矩阵乘法