0

我想在汇编中打印两个数字的总和。当我运行代码时,编译器会显示以下消息:

INT 21h,AH=020h - 尚不支持。请参阅支持的中断列表。

为什么我的代码会产生此错误?我应该使用什么中断代码?

.MODEL SMALL
.STACK 100H
.DATA
A DW 5H
B DW 2H
SUM DW ?
.CODE
MAIN PROC
MOV AX,@DATA
MOV AX,A
ADD AX,B
MOV SUM,AX
INT 21H

MAIN ENDP
END MAIN
4

1 回答 1

4

在调用 MSDOS 中断之前,您必须使用要使用的 MSDOS 功能代码加载 AH。

例如,要打印一个 ASCII 字符,

; assuming AL already contains ASCII character to print
MOV AH, 07H
INT 21H

您没有将有效的功能代码加载到 AH 中。您的编译器在哪里得到 20H 是一个难题,但是由于您将 @DATA 加载到 AX 中而没有对其进行任何操作(例如设置 DS),我想知道您是否在启动时没有指向正确的数据段。

另请注意,MSDOS 从未提供从数值到字符串的转换,因此如果您想显示它,您必须自己转换该值。我相信打印字符串的函数代码是 AH=09H,其中 DS:SI 指向一个以“$”分隔的字符串(不是以 null 结尾的!)。我建议先验证一下。

如果您只想以 base-16 打印它,您可以将每个 4 位部分转换为该十六进制数字对应的可打印 ascii 字符,然后使用函数 07H 打印该字符,但请记住,您从最高位开始4 位,并且您必须从 sum 中重新加载每个 4 位部分的值,因为在设置中断调用时您将丢弃其余的值。

于 2016-04-27T21:58:54.753 回答