当 CX 不是基址或变址寄存器时,为什么它在 16 位汇编中的“[]”中工作?

Why does CX work in '[ ]' in 16 Bit Assembly when it is not a base or index register?

每当我尝试在 DOSBox 下使用 MASM 6.15 时:

mov al, [cx]

mov al, [cx + bx]

mov al, [cx + 4]

我收到错误:'Only Base or Index Registers are allowed'

不过话说回来,假设我有一个数组 var1。 如果我这样做:

.model small
.stack 4096

.data
 var1 BYTE 1, 2, 3, 4, 5, 6, 7, 8, 9

.code
main proc
mov ax, @data
mov ds, ax

mov cx, 5
mov al, [var1 + cx]

mov ah, 4Ch
int 21h
main endp
end main

它工作得很好。为什么它不给出与上面相同的错误? CX 不是基址或变址寄存器。

[]运算符的全部工作本质是什么?

这是 MASM 某些版本中的错误。在某些情况下,MASM 会尝试错误地编码一条本不应该发生的指令。它应该在尝试对其进行编码时抛出错误,因为 CX 不能用作 16 位寻址中的基数或索引。

mov al, [var1 + cx]

它没有生成错误,而是错误地生成了错误:

mov bh, var1[bx+si]

无效指令编码为:

8A B8 xx xx

其中 xx xxvar1 的偏移量。