MASM:如何解决 Immediate mode Illegal in 8086 programming?

MASM: How to resolve Immediate mode Illegal in 8086 programming?

我正在解决汇编语言编程的基本问题,以添加 BCD 数字和两个 ASCII 数字, 为此,我知道我必须分别使用 DAA 和 AAA 指令,现在我试图将存储在 AX 寄存器中的结果存储到我想要的内存位置,但没有得到为什么以下内容代码给我错误立即模式非法 以下是我到目前为止编写的代码,请帮助我如何消除此错误 PS:我只想将我的结果移动到我需要的内存位置,而不是任何特殊用途的寄存器

ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DATA ENDS
CODE SEGMENT
START:
 MOV AX,0000H
 MOV DS,AX
 MOV AL,59
 MOV BL,35
 ADD AL,BL
 DAA
 MOV CX,0000
 MOV ES,CX
 MOV [0000],AX
 MOV AL,04
 MOV BL,05
 ADD AL,BL
 AAA
 MOV CX,0000
 MOV ES,CX
 MOV [0010],AX
 MOV AH,04CH
 INT 21H
CODE ENDS
END START

您遇到的是 MASM 语法中的一个怪癖。当您的内存操作数中只有一个不是标签的立即值(即 [0000][0010])时,MASM 将生成一个 Immediate mode Illegal 错误。这样的指令确实没有任何问题,但 MASM 有特定的语法。您必须明确指定段寄存器。对于这种情况,许多汇编器会假设 DS 但 MASM 不会。

要解决此问题,请使用以下语法:

MOV [DS:0000],AX
MOV [DS:0010],AX

MASM 还允许:

MOV DS:[0000],AX
MOV DS:[0010],AX

首选第一种,因为 TASM(一种 MASM 兼容的汇编程序)不支持后一种形式。如果将段放在其中,它应该可以与 MASM 和 TASM 汇编器以及开源 JWASM 汇编器一起使用。

如果你的内存操作数包括一个寄存器和一个偏移量,那么 MASM 不会抱怨,所以这是有效的 MASM 语法:

MOV [BX+0000],AX
MOV [BX+0010],AX

如果您希望将立即值(源)移动到只是直接引用的内存地址,则语法如下:

MOV WORD PTR [DS:0000], 0100h
MOV BYTE PTR [DS:0000], 00h

需要注意的是0010的值是十进制的10(不是HEX)。目前尚不清楚您是打算在代码中使用十进制还是十六进制。十六进制值有一个 H 后缀。


注意:我发表了关于将现在已删除的段寄存器归零的评论。尽管我的评论是正确的,但我看得不够仔细,没有意识到您确实将 DS 设置为 0000,因此您的代码正在访问 0000:0000 和 0000:0010。在这方面,您的代码是正确的,尽管不清楚您为什么要修改那部分内存。在 IBM-PC 兼容系统上,中断向量 table (IVT) 位于内存的前 1024 字节中。您可能在非 IBM-PC 兼容系统上,您正在做的事情可能根本不是问题。我只是想给你一个关于它的 heads-up。