You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编程序仅接收首次输入,二次输入返回垃圾值问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:50:48