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

标签 assembly x86 dos 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 不是基址或索引寄存器。

[] 运算符的整个工作本质是什么?

最佳答案

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

mov al, [var1 + cx]

它不会生成错误,而是错误地将其生成为:
mov bh, var1[bx+si]

无效指令编码为:
8A B8 xx xx

哪里xx xxvar1 的偏移量.

关于assembly - 当 CX 不是基址或索引寄存器时,为什么 CX 在 16 位汇编中的 '[ ]' 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934673/

相关文章:

windows - 如何在 64 位 Windows 中运行旧的 x86 DOS 汇编程序?

c - C , DOS 中的串行编程

assembly - Skylake 在一个周期内可以执行多少个 1 字节的 NOP

assembly - 如何将两个打包的 64 位四字加载到 128 位 xmm 寄存器中

c - 与堆栈指针

c++ - 做原子操作(C++)卡住CPU

caching - MESI 协议(protocol)中的 L3$ 角色部分是什么

batch-file - MS Dos 批量删除目录中的旧文件

assembly - 为什么某些 SSE "mov"指令指定它们移动浮点值?

linux - 如何将 **long_options option <offset aHelp, 0, 0, 68h>** 翻译成重新汇编代码?