我正在解决汇编语言编程中的一个基本问题,即添加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
发布于 2020-10-16 18:40:08
您正在体验的是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兼容系统上,中断向量表(IVT)位于内存的前1024字节中。您可能是在一个非IBM兼容的系统上,您所做的工作可能根本不是一个问题。我只是想提醒你一下。
https://stackoverflow.com/questions/64391846
复制相似问题