MASM:如何解决8086编程中的立即模式非法



我正在解决汇编语言编程的一个基本问题,添加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兼容系统上,中断向量表(IVT(位于内存的前1024字节中。您可能在非IBM-PC兼容的系统上,您正在做的事情可能根本不是问题。我只是想提醒你一下。

相关内容

  • 没有找到相关文章

最新更新