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

时间:2018-10-22 17:26:22

标签: assembly x86 masm x86-16

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

mov al, [cx]

mov al, [cx + bx]

mov al, [cx + 4]

我收到错误消息:“仅允许基址或索引寄存器”

但是再说一次,我有一个数组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不是基址寄存器或索引寄存器。

[]运算符的全部工作原理是什么?

1 个答案:

答案 0 :(得分:8)

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

mov al, [var1 + cx]

代替生成错误,它错误地生成为:

mov bh, var1[bx+si]

无效指令的编码为:

8A B8 xx xx

xx xxvar1的偏移量。