【问题标题】:Why does CX work in '[ ]' in 16 Bit Assembly when it is not a base or index register?当 CX 不是基址寄存器或索引寄存器时,为什么 CX 在 16 位汇编中的 '[ ]' 中工作?
【发布时间】:2019-03-26 20:14:00
【问题描述】:

当我尝试在 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 不是基址或索引寄存器。

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

【问题讨论】:

  • mov al, [var1 + cx] 实际上不应该工作。 cx 不允许作为基址或变址寄存器(基址寄存器为bxbp,变址寄存器为sidi。其中一个或两个都可以省略)。我怀疑你在这里误解了汇编程序的输出。
  • @fuz 检查我上面粘贴的代码。它组装好,没有任何错误。我正在使用 masm615 (DOSBox)。它不是重复的,我不是说什么寄存器应该起作用。我在问一个代码特定的问题,为什么它不应该工作。
  • 汇编器为此生成什么代码?
  • @prl 你是什么意思?你是说二进制吗?如何提供?

标签: assembly x86 dos masm x86-16


【解决方案1】:

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

mov al, [var1 + cx]

它没有生成错误,而是错误地将其生成为:

mov bh, var1[bx+si]

无效指令编码为:

8A B8 xx xx

其中xx xxvar1 的偏移量。

【讨论】:

  • 你能推荐一个不这样做的masm版本吗?我现在正在使用 masm615。
  • @ParkerQueen 如果您尝试创建 DOS 使用的 16 位可执行文件,那么 MASM615 是可能的最新版本。如果您切换到另一个汇编程序,它可以解决这个问题。 JWASM 通常接近 MASM,在这种情况下会抛出错误。 JWASM 可以在这里找到:sourceforge.net/projects/jwasm/files。您可以使用jwasm -mz file.asm 组装一个组装文件,该文件将生成file.obj,然后可以使用DOS分段链接器进行链接。
  • @MichaelPetch:我已经使用 ML 版本 10.00.40219.01(带有 /OMF 开关)构建了 OP 的示例 - 并且错误仍然存​​在。 MASM 5.1 和更早版本发出正确的错误消息。 TASM 也显示了正确的行为。
  • 即使是 MASM 14.10.25019.0 也有这个 bug,所以看起来它存在于 MASM 6 或更高版本中并且可能永远不会被修复。 (否则您可以使用最新版本的 MASM 来构建 16 位 MS-DOS 可执行文件,诀窍是找到可以的链接器。)
  • @RossRidge :您可能必须像 rkhb 建议的那样回到 5.1,但由于这些版本适用于 DOS 和 OS/2,因此它将无法在 64 位 Windows 下运行。我对 JWASM 的推荐是它基于 Watcom 的 MASM 兼容汇编器;汇编程序在 Win32+ 平台上运行;没有表现出这个错误。至于可以生成 16 位可执行文件的链接器,可以在这里找到:capp-sysware.com/downloads/link16.exe
猜你喜欢
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2021-03-25
相关资源
最近更新 更多