以下代码

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/

10-13 09:42