assembly 0x 8($rsp)的含义

rpppsulh  于 2023-02-23  发布在  其他
关注(0)|答案(2)|浏览(221)

我是第一次学习汇编语言。下面是(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位操作系统。

laawzig2

laawzig21#

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

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

此命令x检查内存。

  • 1表示检查任何指定单位的1。
  • d表示十进制输出(相对于十六进制),我不知道要比较的是什么类型的数据,所以可以使用c来获取char,或者x来获取hex,或者s来获取string,或者其他什么。
  • w提供单位,在本例中为4字节的字。

因此,这个命令查看给定地址0x8(%rsp)处的4个字节,并以十进制格式打印其中的内容。
请注意,访问寄存器内容包括使用$代替%
要了解更多关于使用GDB查看内存如何变化的信息,请参考§10.6 in the user documentation

pb3s4cty

pb3s4cty2#

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

相关问题