为什么间接寻址中的索引器必须是dword?

时间:2016-06-18 11:24:29

标签: assembly x86 irvine32

为什么间接寻址中的索引器必须是dword?

例如,这不起作用:

.data
arr dword 10 dup(?)
.code
...
mov bx, 2
call [arr+bx*4] ;;error A2032:invalid use of register

但使用ebx代替bx会有效,为什么?

1 个答案:

答案 0 :(得分:4)

由于并非所有24种寻址模式都是同时引入的,因此有些模式不适用于16位寄存器。

在一条指令中,寻址模式在字节 modRM SIB 中编码:

Instruction format

可能的 16位寻址模式是:

16-bits addressing modes

如您所见,没有[bx*4] + disp16,因为需要 SIB ,但 SIB 只能指定32位寄存器(64位)注册 REX 前缀):

SIB encodings

您可以在Intel manual 2

上找到所有相关的技术说明