Содержимое стека после вызова функции - PullRequest
0 голосов
/ 24 ноября 2018

Я читаю книгу, в которой объясняется, как работают регистры ebp и eip при вызове функции.Приведен следующий рисунок:

enter image description here

здесь 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?

1 Ответ

0 голосов
/ 24 ноября 2018

Это значение ebp в начале функции.
Это следствие push %ebp и тот факт, что стек x86 имеет значение Full Descending.

Это указатель кадра вызывающего абонента.,


Остерегайтесь того, что компиляторы обновляют способ обработки стека гораздо чаще, чем авторы книг со своими книгами.
В частности: выравнивание, пропуск указателя кадра, RVO, неявные параметры и т. Д.может отбросить тебя

...