1

我试图理解mov汇编中的指令。它看起来像这样:

mov 0x804a12c(,%eax,4),%eax

我知道我们正在将一个新结果移入%eax,那0x804a12c是一个地址,但我不明白这个(,%eax,4)部分。

有什么见解吗?谢谢!

4

3 回答 3

2

这篇0x804a12c(,%eax,4)文章是 x86 中的一种寻址模式。这部分可以这样分解:

DISPLACEMENT(BASE,INDEX,WIDTH )

实际地址由以下公式计算:

BASE + (INDEX * WIDTH ) + DISPLACEMENT

所以指令:

mov 0x804a12c(,%eax,4),%eax

移入寄存器0 + (%eax * 4) + 0x804a12c%eax

于 2013-11-08T19:11:18.540 回答
0

This moves the dword at memory address 0x804a12c + %eax * 4 into %eax. You might expect an instruction like that to be an access at a computed index of a global array of, say, ints.

于 2013-11-08T19:09:54.580 回答
0

这就是我讨厌AT&T 语法的原因!在 Intel 语法中,更容易看到发生了什么:

00000000  8B04852CA10408    mov eax, [eax*4 + 0x804a12c]

请注意,源/目标操作数以 Intel 语法切换。起初有点令人困惑,但这种方式就像 C(想象一个=代替逗号)。

您可以告诉objdump输出 Intel 语法objdump -d -M intel

于 2013-11-12T05:20:22.370 回答