我正在尝试理解程序集中的mov
指令。它看起来像这样:
mov 0x804a12c(,%eax,4),%eax
我知道我们正在将新结果移至%eax
,而0x804a12c
是一个地址,但我没有得到(,%eax,4)
部分。
有什么见解?谢谢!
答案 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
输出英特尔语法。