Просмотр данных, хранящихся в стеке - PullRequest
0 голосов
/ 11 октября 2019

У меня есть следующий источник:

 1  #include<stdio.h>
 2  
 3  int main(void) {
 4      int i= 1337; // breakpoint after this value is assigned
!5      return 0;
 6  }

В asm от gdb я получаю:

!0x00000000004004f1  main+4  movl   $0x539,-0x4(%rbp)

И я подтвердил, что $0x539 = 1337. Как посмотреть адрес памяти, где хранится значение 1337? Значение адреса памяти rbp показывает:

rbp 0x00007fffffffeb20

Я думал, что регистр rbp будет показывать значение 0x539, поэтому где я смогу найти его в gdb (какую команду использовать? и т. д.)?

Я обнаружил одну интересную вещь:

>>> print i
$16 = 1337
>>> print &i
$17 = (int *) 0x7fffffffeb1c # how is this arrived at?

1 Ответ

1 голос
/ 11 октября 2019

0x00007fffffffeb20 - 0x4 == 0x7fffffffeb1c

на x86 почти все константы будут рассматриваться как относительное смещение от регистра. В этом случае регистр имеет значение rbp [адрес кадра], а относительное смещение составляет -4 байта. т.е. константа появляется до первой инструкции в main.

x64 режимы адресации обычно включают одну из 3 возможностей:

  • смещение нулевого байта от адреса регистра
  • 8-битное смещение со знаком от адреса регистра
  • 32-битное смещение со знаком от адреса регистра

(существует 4-й режим адресации, который заключается в загрузке значения из регистра - просто для полноты!). В общем, компилятор предпочел бы испускать эти режимы в порядке, который я перечислил выше (потому что они приводят к коду Op + смещение, которое будет либо: 0 байтов, 1 байт или 4 байта соответственно - чем меньше смещение, темменьше сгенерированный машинный код будет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...