0x8($ rsp)的含义

时间:2013-11-02 23:25:53

标签: assembly gdb x86-64 disassembly

我第一次学习大会郎郎。这是(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 个答案:

答案 0 :(得分:4)

括号通常意味着取消引用。 0x8(%rsp)表示“获取堆栈上距堆栈指针%rsp 8个字节的位置,然后获取该地址的值。”

它将0x131移动到%eax,然后将其与该位置的数据进行比较。 cmp根据该比较设置eflags寄存器(如果操作数相等则为零标志等) 要使用GDB查看地址是什么,请键入

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

此命令'x'检查内存。
1表示检查1指定的任何单位 “d”表示十进制表示法的输出(与十六进制相对)。我不知道你要比较什么类型的数据,所以你可以使用“c”来获取一个字符,或者使用“x”来获得一个字符串,或者使用“s”来获取字符串,或者其他什么。 /> “w”提供单位,在这种情况下是一个单词,即4个字节 因此,此命令查看给定地址的4个字节,0x8(%rsp),并以十进制格式打印任何内容。
要了解有关使用GDB查看内存如何变化的详情,请参阅this document.

答案 1 :(得分:0)

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