Понимание фреймов стека и rbp и rsp с gdb

Я новичок в ассемблерном языке, и я немного запутался в некоторых вещах. В качестве задания мне дают программу на C и меня просят поставить точки останова в двух точках и подсчитать кадры стека и их расположение. Это код:


int swap_n_add(int *xp, int *yp) {

 int x = *xp;
 int y = *yp;

   *xp = y;
   *yp = x;

   int sum = x+y;

   return sum;

}

int main(int argc, char **argv) {
  int a1 = 534;
  int a2 = 1057;
  int sum = swap_n_add(&a1, &a2);
  int diff = a1-a2;

     return sum * diff;
}

Поэтому меня просят использовать gdb для проверки фреймов стека и перечисления их местоположения. В первой точке останова есть два фрейма стека. После выполнения информационного фрейма 0: я получаю следующее:

Stack frame at 0x7fffffffe240:
 rip = 0x4004f9 in swap_n_add (swap-n-add.c:7); saved rip 0x40055d
 called by frame at 0x7fffffffe270
 source language c.
 Arglist at 0x7fffffffe230, args: xp=0x7fffffffe254, yp=0x7fffffffe250
 Locals at 0x7fffffffe230, Previous frame's sp is 0x7fffffffe240
 Saved registers:
  rbp at 0x7fffffffe230, rip at 0x7fffffffe238

У меня вопрос, это rbp - это расположение или рип?

Другой вопрос: "Какие значения хранятся в rbp и rsp? Что это означает для кадра стека?"

Я не уверен, как на это ответить, потому что, насколько я понимаю, rbp - это указатель стека и изменяется каждый раз, когда появляется новая операция. Возможно, я ошибаюсь, но я просто не знаю, как на это ответить.

Извините за длинный вопрос, я просто пытаюсь понять основы

1 ответ

Когда вы вызываете функцию с помощью инструкции call, указатель rip помещается в стек. Больше ничего не происходит.

Вызываемая функция, если она устанавливает полный кадр стека, подталкивает значение rbp (базовое значение последнего кадра), rbp устанавливается на rsp, которое становится базовым значением нового кадра. Rsp изменяется каждый раз, когда что-то выталкивается или извлекается из стека.

Итак, это в основном макет.

previous frame base
<Any automatics variables>
<Any passed variables to the current function passed the first 6th>
return address
new frame base
<Any automatics>
rsp

Когда функция возвращает указатель стека, он должен указывать на адрес в стеке - 8 из адреса возврата или, другими словами, вызов ret - это просто выталкивание стека, вставляющее значение в указатель инструкции.

Другие вопросы по тегам