汇编代码运行报INT 21h AH=09h错误,求故障排查与修复
8086汇编INT 21h AH=09h错误排查与解决
问题描述
参照YouTube教程编写的8086汇编代码,目标是获取用户输入的两个数值,计算乘积后输出结果,但运行模拟器时触发错误:INT 21h, AH=09h - address: 0722F byte 24h not found after 2000 bytes.
同款代码在教程中可正常运行,现需排查错误原因并解决。
编写的汇编代码
.model small .stack 100h .data a db? b db? c db "Insert first value:?" d db 10,13,"Insert second value:?" e db 10,13,"Result:?" .code main proc mov ax,@data mov ds,ax ;Input mov ah,9 lea dx,c int 21h mov ah,1 int 21h sub al,48 mov a,al mov ah,9 lea dx,d int 21h mov ah,1 int 21h sub al,48 mov b,al mov ah,9 lea dx,e int 21h ;Multiplication mov al,a mul b ;Outut mov ah,2 mov dl,al add dl,48 int 21h mov ah,4ch int 21h main endp end main
错误原因
DOS中断INT 21h的AH=09h功能(字符串输出)要求输出的字符串必须以$(ASCII码24h)作为结束标记,用来告知系统字符串的终止位置。你的代码中,c、d、e三个提示字符串都未添加该结束符,导致模拟器执行输出时无法找到终止标记,遍历超出范围后抛出错误。
解决办法
1. 修复字符串结束符问题
在每个提示字符串的末尾添加$符号,修改后的.data段代码如下:
.data a db? b db? c db "Insert first value:? $" d db 10,13,"Insert second value:? $" e db 10,13,"Result:? $"
2. 补充两位数结果输出的修复(可选)
当前代码的乘法输出逻辑仅支持结果≤9的1位十进制数(如2×3=6可正常输出),若结果为两位数(如3×4=12),直接输出al的值会显示错误字符。如果需要支持两位数结果,需拆分十位和个位分别转换为ASCII后输出,修改后的输出段代码如下:
; 替换原有的输出部分 ;Multiplication mov al,a mul b ; 拆分十位和个位(将ax中的结果除以10,al存十位,ah存个位) mov ah,0 mov bl,10 div bl ; 输出十位 mov dl,al add dl,48 mov ah,2 int 21h ; 输出个位 mov dl,ah add dl,48 mov ah,2 int 21h
内容的提问来源于stack exchange,提问作者Mohammad Nahin Islam
相关产品推荐
相关产品推荐

