汇编两位数求和程序输出ASCII符号,如何改为十进制数?
问题分析
你的程序核心问题出在结果转ASCII的逻辑顺序错误,以及除法指令使用不当:
- 你先把完整的结果值直接加30h转ASCII,当数值大于9时(比如33),得到的是超出数字范围的ASCII字符(33+48=81,对应'Q'),这就是你看到的错误符号。
- 使用
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
相关产品推荐
相关产品推荐

