汇编程序仅接收首次输入,二次输入返回垃圾值问题求助
8086汇编输入输出问题的修复方案
问题根源
- 第二次输入的DOS中断调用错误:DOS中断
int 21h的功能号由ah寄存器指定,功能1(带回显输入)要求ah=1,你第二次输入时错误地把1写入al,导致中断执行的不是输入功能,自然得到垃圾值。即便改成mov ah,1,后续的数值转换逻辑依然错误,所以输出还是异常。 - ASCII与数值转换逻辑错误:输入的字符是ASCII码(比如输入'5'得到0x35,即十进制53),你直接将两个ASCII值相加后减48,结果不可能是正确的数字和的ASCII码。正确流程应为:每个输入字符先减48转成十进制数字,相加后再加48转回ASCII字符才能正常输出。
修正后的代码
.model small .stack 100h .data .code main proc ; 第一次输入:调用DOS输入功能(ah=1),读取字符到al mov ah, 1 int 21h sub al, 48 ; 将ASCII字符转为十进制数字(如'3'→3) mov bl, al ; 保存第一个数字到bl ; 第二次输入:同样调用DOS输入功能 mov ah, 1 int 21h sub al, 48 ; 第二个输入字符转为十进制数字 add bl, al ; 两个数字相加 add bl, 48 ; 结果转回ASCII码(如5→'5') ; 输出结果:调用DOS输出功能(ah=2),dl存放待输出的ASCII字符 mov dl, bl mov ah, 2 int 21h ; 程序退出 mov ah, 4ch int 21h main endp end main
关键说明
- 每次输入后立即执行
sub al,48,把字符形式的数字('0'-'9')转换为实际数值(0-9),这是因为ASCII表中'0'的编码是48。 - 数值相加后执行
add bl,48,将计算结果转回ASCII字符,确保用int 21h功能2输出时能显示正确的数字。 - 调用DOS中断前必须正确设置
ah寄存器:输入用ah=1、输出用ah=2、程序退出用ah=4ch。
内容的提问来源于stack exchange,提问作者jack_green
相关产品推荐
相关产品推荐

