以下代码
int _main() {return 0;}
使用命令编译:
gcc -s -nostdlib -nostartfiles 01-simple.c -o01-simple.exe
gcc 版本 4.4.1 (TDM-1 mingw32)
OllyDbg 产生了这个输出:
你能解释一下这里发生了什么吗?
到目前为止的分析:
// these two seems to be an idiom:
PUSH EBP // places EBP on stack
MOV EBP, ESP // overwrites EBP with ESP
MOV EAX, 0 // EAX = 0
LEAVE // == mov esp, ebp
// pop ebp
// according to
// http://en.wikipedia.org/wiki/X86_instruction_listings
这一切的意义是什么?
最佳答案
这将创建一个 stack frame 。
PUSH EBP
MOV EBP, ESP
在所使用的调用约定中,返回值通过
EAX
发送回(所以 0
存在是因为您编写了 return 0;
- 尝试将其更改为 return 1;
并查看它如何影响代码)。MOV EAX, 0
这告诉处理器清理堆栈帧(它相当于
MOV ESP, EBP
后跟 POP EBP
,这与创建堆栈帧时所做的相反):LEAVE
关于c - 最简单程序(x86)的反汇编解说,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2901228/