Понимание стековых фреймов и rbp и rsp с помощью gdb - PullRequest
0 голосов
/ 12 марта 2020

Я новичок в ассемблере, и я немного запутался в некоторых вещах. Для задания мне дали программу 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 Ответ

1 голос
/ 12 марта 2020

Когда вы вызываете функцию с помощью инструкции 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 - просто щелчок стека, помещающий значение в указатель инструкции.

...