c - C 中局部堆栈变量存储在哪里?

标签 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

最佳答案

I know k=4, but I don't see that value in any of the registers. Where would this number be stored then?

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

未经优化,该值存储在堆栈上(准确地说,考虑到反汇编,它存储在位置 $rbp-8 处),并由下一条指令加载到寄存器中(您停止的之前)。

如果您执行stepi并查看$rax的值,您就会在那里找到它。

附注info locals 将为您提供有关局部变量的信息。

更新:

What does stepi do?

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

What/were is $rbp-8? Could you please explain a bit more about what that is and how it works?

每一本 x86 编程入门书籍或教程都会介绍这一点。

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

关于c - C 中局部堆栈变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295967/

相关文章:

c - 贪心算法返回的数量对于小值来说太大,但对于较大的值则不会

c - 使用Makefile后出现 undefined reference 错误

c - 警告 : unknown conversion type character ‘"’ in format when using dprintf

linux - 递归列出目录内容,并检查文件是否为目录

C、获取给定指针的内存段

c - 预测 C 代码中的缺陷

C++ 优化 if/else 条件

linux - 如何在 NASM、Linux、32 位中选择对齐方式

c - 从程序内部调用 gdb 以打印其堆栈跟踪的最佳方法?

assembly - 如何通过gdb获取从链接器导入的全局变量的值?