以下是核心文件中的一行汇编代码。
0x00002ac8c957012d <+45>: mov 0x8(%rsp), %rsi
我注意到注册表rsp位于以下位置,因此我使用Examine命令查看内容以及另外16个对象/字节。
> x/16x 0x2acd5752a610
0x2acd5752a610: 0x70 0xa6 0x11 0xff 0x29 0xcd 0x22 0x00
0x2acd5752a618: 0x33 0xee 0xf1 0xa9 0xb2 0xcc 0x34 0x76
当计算出0x8的偏移量时,这将基于0,从而导致值为0x33,或者只是从开始时的1到8开始计数,导致值为0x00?
答案 0 :(得分:3)
你会被AT&amp; T语法的大脑憎恶所迷惑。
英特尔的预期语法mov 0x8(%rsp), %rsi
转换为:
mov rsi,[rsp+8]
这意味着用地址rsi
的8个字节填充寄存器[rsp+8]
的8个字节
请注意,rsp
是一个64位(8字节)寄存器,一次处理8个字节
我们不知道rsp
的值是什么,但是我们知道rsp
是堆栈指针而+8
意味着我们将地址高出堆栈指针8个字节,或者第二个最近推送的堆栈值(因为堆栈向下增长)。
这条指令在堆栈内偷偷摸摸: - )