我第一次学习汇编语言。这是(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
我很难弄清楚它的比较是什么。 0x8(%rsp)
的值是多少。
(我知道这个问题听起来很愚蠢)
提前致谢
==========
最后我解决了
(gdb) p /x *(int *)($rsp+0x8)
在这篇文章的帮助下How to print -0x4(%rbp) in gdb?
Zack 的答案应该是正确的,但它不起作用,因为我使用的是 64 位操作系统。
最佳答案
括号通常意味着取消引用。 0x8(%rsp)
表示“获取堆栈上距堆栈指针 %rsp
8 个字节的位置,然后取出该地址处的值。”
它将 0x131
移动到 %eax
中,然后将其与该位置的数据进行比较。 cmp 根据该比较设置 eflags 寄存器(如操作数相等时的零标志等)
要使用 GDB 查看地址中的内容,请键入
(gdb) x/1dw 0x8($esp)
此命令x
检查内存。
1 表示检查指定的任何单位的 1。
d
表示以十进制表示法输出(而不是十六进制)。我不知道您要比较的数据类型,因此您可以使用c
获取字符,或x
获取十六进制,或>s
表示字符串,或者其他。w
提供单位,在本例中是一个字,即 4 个字节。
因此,此命令查看给定地址 0x8(%rsp)
处的 4 个字节,并以十进制格式打印其中的任何内容。
请注意accessing register contents includes using $
in place of %
.
要了解有关使用 GDB 查看内存变化情况的更多信息,请参阅 §10.6 in the user documentation .
关于assembly - 0x8($rsp) 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748074/