Assembly - 帮助我理解程序序言
Assembly - Help me understand the procedure prologue
堆栈从较高的内存地址增长到较低的内存地址,下面的代码让我感到困惑,在行#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>
对于典型的 32 位调用约定和典型的序言,ebp+08h
以上或处的值是过程参数。
ebp
以下的值是局部变量。
ebp
处的值是旧帧指针,ebp+04h
处的值是return地址。
访问 esp
下面的内存(注意:esp
而不是 ebp
)是不可预测的,但是上面的地址没问题(正是因为堆栈向下增长)。
SYS V x64 ABI 在 rsp
下面定义了一个红色区域,无论如何都可以使用。
堆栈从较高的内存地址增长到较低的内存地址,下面的代码让我感到困惑,在行#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>
对于典型的 32 位调用约定和典型的序言,ebp+08h
以上或处的值是过程参数。
ebp
以下的值是局部变量。
ebp
处的值是旧帧指针,ebp+04h
处的值是return地址。
访问 esp
下面的内存(注意:esp
而不是 ebp
)是不可预测的,但是上面的地址没问题(正是因为堆栈向下增长)。
SYS V x64 ABI 在 rsp
下面定义了一个红色区域,无论如何都可以使用。