【问题标题】:Seeing data stored on the stack查看存储在堆栈中的数据
【发布时间】:2019-10-11 02:54:14
【问题描述】:

我有以下源代码:

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

在来自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?

【问题讨论】:

    标签: c assembly gdb


    【解决方案1】:

    0x00007fffffffeb20 - 0x4 == 0x7fffffffeb1c

    在 x86 上,几乎所有常量都将作为与寄存器的相对偏移量来寻址。在这种情况下,寄存器是 rbp [帧地址],相对偏移量是 -4 字节。即常量出现在 main 中的第一条指令之前。

    x64 寻址模式通常涉及以下三种可能性之一:

    • 与寄存器地址的零字节偏移
    • 与寄存器地址的有符号 8 位偏移量
    • 与寄存器地址的有符号 32 位偏移量

    (有第 4 种寻址模式,即从寄存器加载值 - 只是为了完整性!)。一般来说,编译器更愿意按照我上面列出的顺序发出这些模式(因为它们会导致操作码 + 偏移量,分别为:0bytes、1byte 或 4bytes - 所以偏移量越小,生成的机器代码会更小)。

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 2011-03-03
      • 2013-12-06
      • 2011-07-24
      • 2021-01-25
      • 1970-01-01
      • 2013-12-04
      • 2011-07-25
      • 2011-06-26
      相关资源
      最近更新 更多