计算要获取的字节数,汇编

时间:2013-06-30 17:29:20

标签: linux assembly fetch disassembly

我想要计算“fetch”需要多少字节。

我正在编写汇编代码

jmp [2*eax]

并且列表文件中的命令是3个字节。

当我写这个命令时:

jmp [4*eax]

我有7个字节

有谁知道为什么?

1 个答案:

答案 0 :(得分:2)

我怀疑你的汇编程序很聪明,并且正在将jmp [2*eax]编码为jmp [eax+eax],因为它不需要位移,所以它占用的字节数更少。而jmp [4*eax]实际上相当于jmp [4*eax+0x00000000],需要额外的4个字节来代替位移。

它与SIB(缩放索引字节)的工作原理有关。通常,这会以base + index*scale + displacement的形式对地址进行编码。 displacement 是可选的,但仅当包含 base 寄存器时。如果您想要取消 base 寄存器,那么您将被迫包含32位位移

因此要获得eax*4,您需要使用index*4 + displacement表格,即使您不需要置换。但是要获取eax * 2,您可以使用base + index*scale形式(即eax+eax*1),并避免必须包含置换