IA32装配移动指令

时间:2013-11-08 19:04:35

标签: assembly x86

我正在尝试理解程序集中的mov指令。它看起来像这样:

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

我知道我们正在将新结果移至%eax,而0x804a12c是一个地址,但我没有得到(,%eax,4)部分。

有什么见解?谢谢!

3 个答案:

答案 0 :(得分:2)

0x804a12c(,%eax,4)段是x86中的寻址方式。其中的部分可以像这样分解:

DISPLACEMENT(BASE,INDEX,WIDTH )

并且实际地址由公式计算:

BASE + (INDEX * WIDTH ) + DISPLACEMENT

所以说明:

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

0 + (%eax * 4) + 0x804a12c移至%eax注册表中。

答案 1 :(得分:0)

这会将内存地址0x804a12c + %eax * 4的双字移动到%eax。您可能希望这样的指令是对全局数组(例如,整数)的计算索引的访问。

答案 2 :(得分:0)

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

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

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

您可以告诉objdump使用objdump -d -M intel输出英特尔语法。