在程序集

时间:2016-04-27 21:27:06

标签: assembly emu8086

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

  

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

1 个答案:

答案 0 :(得分: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位,你必须为每个4位部分重新加载sum的值,因为在设置中断调用时你将丢弃其余的值。