当 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 xx
是 var1
的偏移量。
每当我尝试在 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 xx
是 var1
的偏移量。