0x8($ rsp)的含义

Shi*_*i.J 2 assembly gdb x86-64 disassembly

我第一次学习Assembly Lang。这是(gdb)反汇编的一部分:

mov    $0x131,%eax
cmp    0x8(%rsp),%eax  //Question here, what is the value of 0x8(%rsp)?




(gdb)i r
rax            0x131    305
rbx            0x7fffffffe578   140737488348536
rcx            0x20     32
rdx            0x7fffffffe478   140737488348280
rsi            0x0      0
rdi            0x1999999999999999       1844674407370955161
rbp            0x0      0x0
rsp            0x7fffffffe470   0x7fffffffe470
r8             0x37ed3bb080     240203313280
r9             0x0      0
r10            0x1e     30
r11            0x0      0
r12            0x400cb0 4197552
r13            0x7fffffffe570   140737488348528
r14            0x0      0
r15            0x0      0
rip            0x400fd9 0x400fd9 <phase_3+129>
eflags         0x212    [ AF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
Run Code Online (Sandbox Code Playgroud)

我很难弄清楚它的比较。的值是多少0x8(%rsp)

(我知道这个问题听起来很愚蠢)

提前致谢

=-==========

最后我解决了

(gdb) p /x *(int *)($rsp+0x8)
Run Code Online (Sandbox Code Playgroud)

借助这篇文章如何在gdb中打印-0x4(%rbp)?

Zack的答案应该是正确的,但是由于我使用的是64位操作系统,因此无法正常工作。

Zac*_*ark 5

括号通常意味着取消引用。0x8(%rsp)的意思是“获取堆栈上与堆栈指针%rsp距离8个字节的位置,然后取该地址处的值。”
它将0x131移动到%eax,然后将其与该位置的数据进行比较。cmp eflags根据该比较设置寄存器(例如,如果操作数相等,则为零标志,等等。)
要使用GDB查看地址中的内容,请键入

(gdb) x/1dw 0x8(%esp)
Run Code Online (Sandbox Code Playgroud)

此命令“ x”检查内存。
1表示检查指定的任何单位之一。
“ d”表示以十进制表示的输出(与十六进制相对)。我不知道您要进行比较的数据类型,因此您可以使用“ c”获取字符,或使用“ x”获取十六进制,或使用“ s”获取字符串,等等。
“ w”提供单位,在这种情况下为一个字,为4个字节。
因此,此命令在给定地址0x8(%rsp)处查看4个字节,并以十进制格式打印其中的任何内容。
要了解有关使用GDB查看内存变化的更多信息,请参阅本文档。

  • 对于我的 64 位操作系统, (gdb) p /x *(int *)($rsp+0x8) 适合我。x/1dw 0x8(%esp) 在 64 位操作系统中会导致语法错误。不管怎样,你的回答真的很有帮助,非常感谢。 (3认同)