我想要计算“fetch”需要多少字节。
我正在编写汇编代码
jmp [2*eax]
并且列表文件中的命令是3个字节。
当我写这个命令时:
jmp [4*eax]
我有7个字节
有谁知道为什么?
答案 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
),并避免必须包含置换。