更正汇编中的中断代码

Correct interrupt code in assembly

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

INT 21h, AH=020h - not supported yet. refer to the list of supported interrupts.

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

.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

在调用MSDOS中断之前,您必须将要使用的MSDOS函数代码加载到AH中。

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

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

您没有将有效的功能代码加载到 AH 中。你的编译器在哪里得到 20H 是个谜,但是因为你在没有对它做任何事情(比如设置 DS)的情况下将 @DATA 加载到 AX 中,我想知道你是否在启动时没有指向正确的数据段。

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

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