我试图理解mov
汇编中的指令。它看起来像这样:
mov 0x804a12c(,%eax,4),%eax
我知道我们正在将一个新结果移入%eax
,那0x804a12c
是一个地址,但我不明白这个(,%eax,4)
部分。
有什么见解吗?谢谢!
这篇0x804a12c(,%eax,4)
文章是 x86 中的一种寻址模式。这部分可以这样分解:
DISPLACEMENT(BASE,INDEX,WIDTH )
实际地址由以下公式计算:
BASE + (INDEX * WIDTH ) + DISPLACEMENT
所以指令:
mov 0x804a12c(,%eax,4),%eax
移入寄存器0 + (%eax * 4) + 0x804a12c
。%eax
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.
这就是我讨厌AT&T 语法的原因!在 Intel 语法中,更容易看到发生了什么:
00000000 8B04852CA10408 mov eax, [eax*4 + 0x804a12c]
请注意,源/目标操作数以 Intel 语法切换。起初有点令人困惑,但这种方式就像 C(想象一个=
代替逗号)。
您可以告诉objdump
输出 Intel 语法objdump -d -M intel
。