Assembly 汇编程序中正确的中断代码

Assembly 汇编程序中正确的中断代码,assembly,emu8086,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 在调用MSDOS中断之前,您必

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

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

在调用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位部分的值,因为在设置中断调用时,您将丢弃其余的值。

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

例如,要打印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位部分重新加载值,因为在设置中断调用时,您将丢弃其余的值。

EMU8086还有很多事情尚未完成,可能是将来的版本。您的问题是,您使用INT 21h时,没有将要使用的MS-DOS服务的编号加载到AH寄存器中。因此,它不会调用您想要使用的服务,而是调用与AH中恰好存在的值相对应的任何服务。这是因为您使用的模拟器不支持您尝试使用的功能。EMU8086还没有做很多事情,可能是将来的版本。您的问题是,您使用INT 21h时,没有将要使用的MS-DOS服务的编号加载到AH寄存器中。因此,它不会调用您想要使用的服务,而是调用与AH中恰好存在的值相对应的任何服务。这是因为您使用的模拟器不支持您尝试使用的功能。这是一个很好的猜测。我错过了他从未做过的动作。我在想,他一定发布了与生成错误消息的代码不匹配的代码,因为5+2会留下
AH=0
。这段代码猜得不错。我错过了他从未做过的动作。我想他一定发布了与生成错误消息的代码不匹配的代码,因为5+2将离开
AH=0