Я читаю книгу, в которой объясняется, как работают регистры ebp
и eip
при вызове функции.Приведен следующий рисунок:
здесь array
- локальная переменная функции.Аргументы функции: a
и b
.Вот как выглядит настоящий код C:
#include <stdio.h>
void function(int a, int b)
{
int array[8];
}
int main()
{
function(1,2);
return 0;
}
Я компилирую с gcc -m32 -g function.c
и запускаю программу в gdb
.Команда disas main
показывает (пропущено несколько строк):
0x08048474 : push $0x2
0x08048476 : push $0x1
0x08048478 : call 0x804843b
<b>0x0804847d</b> : add $0x10,%esp
первые и последние несколько инструкций функции ():
0x0804843b : push %ebp
0x0804843c : mov %esp,%ebp
0x0804843e : sub $0x38,%esp
0x08048441 : mov %gs:0x14,%eax
0x08048447 : mov %eax,-0xc(%ebp)
0x0804844a : xor %eax,%eax
0x0804844c : nop
...
0x0804845e : leave
0x0804845f : ret
и когда я проверяю содержимое ebp
:
(gdb) x/4xw $ebp
0xffffcd48: 0xffffcd68 <b>0x0804847d</b> 0x00000001 0x00000002
Я понимаю, что в стеке за ebp
должно следовать местоположение возврата 0x0804847d
и аргументы функции 0x00000001
и 0x00000002
.Однако я не знаю, что такое 0xffffcd68
.Это адрес ebp
?