每当我尝试在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不是基址寄存器或索引寄存器。
[]运算符的全部工作原理是什么?
答案 0 :(得分:8)
这是某些 MASM 版本中的错误。在某些情况下, MASM 会尝试错误地编码不应执行的指令。尝试对此进行编码应该抛出错误,因为 CX 不能用作16位寻址的基数或索引。
mov al, [var1 + cx]
代替生成错误,它错误地生成为:
mov bh, var1[bx+si]
无效指令的编码为:
8A B8 xx xx
xx xx
是var1
的偏移量。