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

汇编两位数求和程序输出ASCII符号,如何改为十进制数?

问题分析

你的程序核心问题出在结果转ASCII的逻辑顺序错误,以及除法指令使用不当:

  1. 你先把完整的结果值直接加30h转ASCII,当数值大于9时(比如33),得到的是超出数字范围的ASCII字符(33+48=81,对应'Q'),这就是你看到的错误符号。
  2. 使用div bx是16位除法,但你仅处理8位结果,应该用div bl(8位除法,除数存在bl,被除数是ax,商存al,余数存ah)。
修改方案

调整结果转换的逻辑,正确拆分高位和低位,再分别转ASCII。同时支持三位数结果(比如99+99=198),避免前导零输出:

修正后的完整代码

.model small 
.stack 100h
.data
digit1 db "enter first digit: $"
digit2 db 10,13,"enter 2nd digit: $"
number1 db 0
number2 db 0
first_number db 0
second_number db 0
result db 0
result_digit1 db 0  ; 个位
result_digit2 db 0  ; 十位
result_digit3 db 0  ; 百位(新增,支持三位数结果)

.code
main proc
    mov ax,@data
    mov ds,ax

    ; 输入第一个两位数
    lea dx, digit1
    mov ah, 09h
    int 21h

    mov ah, 01h
    int 21h
    sub al, 30h
    mov [number1], al

    mov ah, 01h
    int 21h
    sub al, 30h
    mov [number2], al

    mov al, [number1]
    mov bl, 10
    mul bl
    add al, [number2]
    mov [first_number], al

    ; 输入第二个两位数
    mov ah, 09h
    mov dx, offset digit2
    int 21h

    mov ah, 01h
    int 21h
    sub al, 30h
    mov [number1], al

    mov ah, 01h
    int 21h
    sub al, 30h
    mov [number2], al

    mov al, [number1]
    mov bl, 10
    mul bl
    add al, [number2]
    mov [second_number], al

    ; 计算两数之和
    mov al, [first_number]
    add al, [second_number]
    mov [result], al

    ; 转换结果为ASCII(正确逻辑)
    mov ah, 0          ; 8位除法需要ax作为被除数,ah清0
    mov bl, 100
    div bl             ; ax / 100,商(百位)在al,余数在ah
    add al, 30h        ; 百位转ASCII
    mov [result_digit3], al

    mov al, ah         ; 把余数放到al,继续拆分十位和个位
    mov ah, 0
    mov bl, 10
    div bl             ; ax /10,商(十位)在al,余数(个位)在ah
    add al, 30h
    mov [result_digit2], al

    mov al, ah
    add al, 30h
    mov [result_digit1], al

    ; 输出结果(判断百位是否为0,避免前导零)
    mov ah, 02h
    mov dl, [result_digit3]
    cmp dl, '0'
    je skip_hundred    ; 百位是0则不输出
    int 21h
skip_hundred:
    mov dl, [result_digit2]
    int 21h
    mov dl, [result_digit1]
    int 21h

    ; 程序正常退出
    mov ah, 4Ch
    int 21h

Main endp
End main

关键修改点

  • 替换除法指令:用div bl替代div bx,适配8位数据处理,避免16位除法的错误。
  • 调整转换顺序:先拆分百位、十位,再处理个位,每拆分出一位立即转ASCII码(加30h)。
  • 支持三位数结果:新增百位存储变量,通过判断跳过前导零输出。
  • 添加退出指令:补充mov ah,4Ch; int21h,确保程序运行后正常退出DOS环境。

测试验证

输入11和22时,结果33会正确输出为"33";输入99和99时,结果198会输出为"198",均不会出现错误ASCII符号。

内容的提问来源于stack exchange,提问作者Myste Myzte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:05:33