4

我第一次学习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

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

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

提前致谢

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

最后我解决了

(gdb) p /x *(int *)($rsp+0x8)

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

Zack 的回答应该是对的,但是因为我使用的是 64 位操作系统,所以它不起作用。

4

2 回答 2

7

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

(gdb) x/1dw 0x8(%esp)

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

于 2013-11-02T23:29:47.327 回答
1

因为程序通过减去堆栈指针分配了一些堆栈内存。现在当它想使用分配的堆栈内存时,他们需要使用一个偏移量来取消引用。

于 2015-11-28T17:25:09.067 回答