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

Why does the indexer in indirect addressing have to be a dword?

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

例如,这行不通:

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

但是使用 ebx 而不是 bx 会起作用,为什么?

由于24种寻址方式没有同时介绍,所以有些是16位寄存器不具备的。

在指令中,寻址模式在字节 modRMSIB:

中编码

可能的 16 位寻址模式是:

如您所见,没有 [bx*4] + disp16,因为需要 SIB,但 SIB 可以仅指定 32 位寄存器(带有 REX 前缀的 64 位寄存器):


您可以在 Intel manual 2

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