每当我尝试在 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 不是基址或索引寄存器。
[] 运算符的整个工作本质是什么?
最佳答案
这是某些版本的 MASM 中的错误。在某些情况下,MASM 会尝试错误地编码一条不应该出现的指令。尝试对其进行编码时应该会引发错误,因为 CX 不能用作 16 位寻址中的基址或索引。
mov al, [var1 + cx]
它不会生成错误,而是错误地将其生成为:
mov bh, var1[bx+si]
无效指令编码为:
8A B8 xx xx
哪里
xx xx
是 var1
的偏移量.
关于assembly - 当 CX 不是基址或索引寄存器时,为什么 CX 在 16 位汇编中的 '[ ]' 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934673/