解释最简单的程序(x86)

Geo*_*rge 3 c x86 assembly ollydbg

以下代码

int _main() {return 0;}
Run Code Online (Sandbox Code Playgroud)

使用命令编译:

gcc -s -nostdlib -nostartfiles 01-simple.c -o01-simple.exe
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这一切是什么意思?

R S*_*hko 5

这会创建一个堆栈框架.

PUSH EBP      
MOV EBP, ESP  
Run Code Online (Sandbox Code Playgroud)

在使用的调用约定中,返回值是通过EAX(0因为你写的return 0;- 请尝试将其更改为return 1;并查看它如何影响代码)发送回来的.

MOV EAX, 0 
Run Code Online (Sandbox Code Playgroud)

这告诉处理器清理堆栈帧(它的MOV ESP, EBP后面POP EBP是与创建堆栈帧时相反的内容):

LEAVE
Run Code Online (Sandbox Code Playgroud)