带偏移量的MOV指令

时间:2017-06-22 20:04:53

标签: assembly x86 att

以下是核心文件中的一行汇编代码。

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?

1 个答案:

答案 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个字节,或者第二个最近推送的堆栈值(因为堆栈向下增长)。

这条指令在堆栈内偷偷摸摸: - )