我是第一次学习汇编语言。下面是(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位操作系统。
2条答案
按热度按时间laawzig21#
圆括号通常表示解引用。
0x8(%rsp)
表示“获取堆栈上距离堆栈指针%rsp
8个字节的位置,然后获取该地址的值”。它将
0x131
移到%eax
,然后将其与该位置的数据进行比较。cmp根据比较结果设置eflags
寄存器(如操作数相等时的零标志等)。要使用GDB查看地址中的内容,请键入
此命令
x
检查内存。d
表示十进制输出(相对于十六进制),我不知道要比较的是什么类型的数据,所以可以使用c
来获取char,或者x
来获取hex,或者s
来获取string,或者其他什么。w
提供单位,在本例中为4字节的字。因此,这个命令查看给定地址
0x8(%rsp)
处的4个字节,并以十进制格式打印其中的内容。请注意,访问寄存器内容包括使用
$
代替%
。要了解更多关于使用GDB查看内存如何变化的信息,请参考§10.6 in the user documentation。
pb3s4cty2#
因为程序通过减去堆栈指针分配了一些堆栈内存。现在当它要使用分配的堆栈内存时,需要使用一个偏移量来解引用。