汇编 - 帮助我理解程序序言

时间:2017-01-20 15:52:30

标签: assembly x86 stack disassembly

堆栈从较高的内存地址增长到较低的内存地址,下面的代码让我感到困惑,在第1行esp被复制到ebp寄存器,第3行esp被8减去,但是第16行变量由ebp + 8 访问,有人可以解释为什么它不是ebp - 8?

(gdb) disass main
Dump of assembler code for function main:
0x08048474 <main+0>:    push   ebp
0x08048475 <main+1>:    mov    ebp,esp
0x08048477 <main+3>:    sub    esp,0x8
0x0804847a <main+6>:    and    esp,0xfffffff0
0x0804847d <main+9>:    mov    eax,0x0
0x08048482 <main+14>:   sub    esp,eax
0x08048484 <main+16>:   cmp    DWORD PTR [ebp+8],0x1
0x08048488 <main+20>:   jg     0x80484ab <main+55>
0x0804848a <main+22>:   mov    eax,DWORD PTR [ebp+12]
0x0804848d <main+25>:   mov    eax,DWORD PTR [eax]
0x0804848f <main+27>:   mov    DWORD PTR [esp+4],eax
0x08048493 <main+31>:   mov    DWORD PTR [esp],0x80485e5
0x0804849a <main+38>:   call   0x804831c <printf@plt>
0x0804849f <main+43>:   mov    DWORD PTR [esp],0x0
0x080484a6 <main+50>:   call   0x804833c <exit@plt>
0x080484ab <main+55>:   mov    eax,DWORD PTR [ebp+12]
0x080484ae <main+58>:   add    eax,0x4
0x080484b1 <main+61>:   mov    eax,DWORD PTR [eax]
0x080484b3 <main+63>:   mov    DWORD PTR [esp],eax
0x080484b6 <main+66>:   call   0x8048414 <function1>

1 个答案:

答案 0 :(得分:3)

对于典型的32位调用约定和典型的序言,上面或ebp+08h处的值是过程参数。

ebp以下的值是本地变量。

ebp处的值是旧帧指针,ebp+04h处的值是返回地址。

请参阅the calling conventions

访问esp下方的内存(请注意:esp而不是ebp)是不可预测的,但上面的地址很好(完全是因为堆栈向下增长) 。
SYS V x64 ABI定义了rsp以下的红色区域,无论如何都可以使用。