为什么间接寻址中的索引器必须是双字?
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位寄存器不具备的。
在指令中,寻址模式在字节 modRM 和 SIB:
中编码
可能的 16 位寻址模式是:
如您所见,没有 [bx*4] + disp16
,因为需要 SIB,但 SIB 可以仅指定 32 位寄存器(带有 REX 前缀的 64 位寄存器):
您可以在 Intel manual 2
上找到所有相关的技术说明
为什么间接寻址中的索引器必须是双字?
例如,这行不通:
.data
arr dword 10 dup(?)
.code
...
mov bx, 2
call [arr+bx*4] ;;error A2032:invalid use of register
但是使用 ebx
而不是 bx
会起作用,为什么?
由于24种寻址方式没有同时介绍,所以有些是16位寄存器不具备的。
在指令中,寻址模式在字节 modRM 和 SIB:
中编码可能的 16 位寻址模式是:
如您所见,没有 [bx*4] + disp16
,因为需要 SIB,但 SIB 可以仅指定 32 位寄存器(带有 REX 前缀的 64 位寄存器):
您可以在 Intel manual 2
上找到所有相关的技术说明