首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MASM:如何解决8086编程中的即时模式非法?

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

Stack Overflow用户
提问于 2020-10-16 15:11:35
回答 1查看 2.1K关注 0票数 2

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

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-16 18:40:08

您正在体验的是MASM语法中的一个怪癖。当您的内存操作数中只有一个非标签(即[0000][0010])的直接值时,MASM将生成一个Immediate mode Illegal错误。这样的指令并没有什么问题,但是MASM有特定的语法。必须显式指定段寄存器。在这种情况下,许多汇编程序会假设DS,但MASM没有。

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

代码语言:javascript
运行
复制
MOV [DS:0000],AX
MOV [DS:0010],AX

MASM还允许:

代码语言:javascript
运行
复制
MOV DS:[0000],AX
MOV DS:[0010],AX

第一个是首选的,因为TASM (一个MASM兼容汇编程序)不支持后一种形式。如果将段放在其中,那么它应该同时与MASM和TASM汇编程序以及开源的JWASM汇编程序一起工作。

如果您的内存操作数包括寄存器和偏移量,则MASM不会抱怨,因此这是有效的MASM语法:

代码语言:javascript
运行
复制
MOV [BX+0000],AX
MOV [BX+0010],AX

如果希望将即时值(源)移动到仅为即时引用的内存地址,则语法如下所示:

代码语言:javascript
运行
复制
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兼容的系统上,您所做的工作可能根本不是一个问题。我只是想提醒你一下。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64391846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档