Где локальные переменные стека хранятся в C? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть следующая программа на C:

1  #include<stdio.h>
2  
3  int main(void) {
4      int i=0;
5      for (int k=0; k<10; k++)
6          printf("Number: %d", k);
7      printf("Hello\n");
8      return 0;
9  }

Когда я запускаю ее в gdb, она выдаёт мне список всех регистров, но я не вижу переменную k влюбой из этих тигров. Например, на снимке экрана ниже я знаю k=4, но я не вижу это значение ни в одном из регистров. Где будет храниться этот номер?

enter image description here

1 Ответ

0 голосов
/ 09 октября 2019

Я знаю k = 4, но я не вижу это значение ни в одном из регистров. Где же тогда будет храниться это число?

Если вы оптимизируете программу, значение, скорее всего, будет сохранено в регистре (но отладку программы будет намного сложнее).

Без оптимизации значение сохраняется в стеке (если быть точным, учитывая разборку, оно хранится в местоположении $rbp-8) и загружается в регистр самой следующей инструкцией (той, которая перед который вы остановили).

Если вы сделаете stepi и посмотрите на значение $rax, вы найдете его прямо здесь.

PS info locals даст вам информацию олокальные переменные.

Обновление:

Что делает stepi?

Выполняет одну машинную инструкцию, затем останавливается. Вы можете узнать это, прочитав руководство или используя команду help stepi GDB.

Что такое / было $ rbp-8? Не могли бы вы объяснить немного больше о том, что это такое и как оно работает?

Это то, что будет описано в каждой вводной книге по программированию для x86.

Вкратце, актуальноСостояние выполнения программы можно описать как последовательность связанных записей активации или «фреймов». На x86 без оптимизации регистр $RBP обычно используется как регистр указателя кадра (т.е. он указывает на текущий кадр). Локальные данные хранятся с отрицательным смещением от указателя кадра (здесь k сохраняется со смещением -8).

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