【问题标题】:MASM: How to resolve Immediate mode Illegal in 8086 programming?MASM:如何解决 8086 编程中的即时模式非法?
【发布时间】:2021-01-31 03:13:42
【问题描述】:

我正在解决一个汇编语言编程的基本问题,以添加 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

【问题讨论】:

  • 感谢您的回复,实际上我想将结果移动到任何随机位置,因此我想将其存储在 0000:0000 和 0000:0010 @MichaelPetch
  • 谢谢,请发表您的回答
  • 现在我向您学习了,非常感谢您,先生

标签: assembly dos x86-16 masm addressing-mode


【解决方案1】:

您遇到的是 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)。目前尚不清楚您是否打算在代码中使用十进制或十六进制。 HEX 值具有H 后缀。


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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多