为什么我的程序的输出不断变化? 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
。
我写了一个程序来求给定一个更大的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
。