本地堆栈变量存储在C中的哪里?

时间:2019-10-09 01:43:35

标签: c assembly gdb

我在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 :(得分:0)

  

我知道k = 4,但是在任何寄存器中都没有看到那个值。那么该号码将存储在哪里?

如果优化了程序,则该值确实可能存储在寄存器中(但程序将很难调试)。

未经优化,该值将存储在堆栈中(准确地说,是在进行反汇编的情况下,它存储在位置$rbp-8中),并由下一条指令(一个 之前)。

如果您执行stepi并查看$rax的值,则可以在其中找到它。

P.S。 info locals将为您提供有关局部变量的信息。

更新

  

stepi做什么?

它执行一条机器指令,然后停止。您可以通过阅读手册或使用help stepi GDB命令来找到答案。

  

$ rbp-8是什么?您能再解释一下这是什么以及它如何工作吗?

每本x86入门编程书籍或教程都将涉及到这一点。

简而言之,程序执行的当前状态可以描述为一系列链接的激活记录或“框架”。在未经优化的x86上,$RBP寄存器通常用作帧指针寄存器(即,它指向当前帧)。本地变量与帧指针的偏移量为负(此处k的偏移量为-8)。