汇编程序求和异常排查:读取4整数求最小及求和大于9结果错误
问题分析
你遇到的核心问题是混淆了寄存器的二进制存储和十进制解读,以及缺少多位数十进制转ASCII的处理:
- 9+9的十进制是18,对应十六进制是
12H,BH寄存器里存的12是十六进制值,实际就是十进制的18,数值本身是对的,但你误以为是十进制的12。 - 错误出在后续输出环节(你代码里没贴输出总和的部分),如果直接把BH里的数值转ASCII输出,会因为没有拆分十位和个位,导致显示错误。
解决方案
- 保持总和的二进制累加逻辑(这部分是对的),建议用16位寄存器(比如AX)存储总和,避免溢出(虽然4个0-9的数总和最大36,8位足够,但16位更稳妥)。
- 输出总和前,需要把二进制数值转换成十进制ASCII字符串,拆分十位和个位后分别输出。
修改后的完整代码
data segment msg db "chiffre: $" petit db "plus petit chiffre: $" somme db "somme: $" newline db 0Dh, 0Ah, "$" ; 换行符 ends stack segment dw 128 dup(0) ends code segment start: ; 设置段寄存器 mov ax, data mov ds, ax mov es, ax ; 读取第一个数 mov ah, 09h mov dl, offset msg int 21h mov ah, 01h int 21h mov bl, al ; bl 存最小值(ASCII形式) sub al, '0' mov ax, 0 mov al, al ; ax 存总和(数值形式,初始为第一个数的数值) mov cx,3 etq: ; 换行 mov ah, 09h mov dl, offset newline int 21h ; 提示输入下一个数 mov ah, 09h mov dl, offset msg int 21h ; 读取输入 mov ah, 01h int 21h ; 更新最小值 cmp al, bl jb update_min jmp continue_sum update_min: mov bl, al continue_sum: ; 累加总和 sub al, '0' add ax, al loop etq ; 输出最小值 mov ah, 09h mov dl, offset newline int 21h mov ah, 09h mov dl, offset petit int 21h mov ah, 02h mov dl, bl int 21h ; 输出总和 mov ah, 09h mov dl, offset newline int 21h mov ah, 09h mov dl, offset somme int 21h ; 将总和(ax中的数值)转十进制ASCII输出 mov cx, 0 mov bx, 10 convert: xor dx, dx div bx ; ax = ax /10, dx = ax %10 push dx ; 保存个位 inc cx cmp ax, 0 jne convert print_sum: pop dx add dl, '0' ; 转ASCII mov ah, 02h int 21h loop print_sum ; 程序退出 mov ah, 4Ch int 21h ends end start
关键修改点
- 用AX存储总和,避免8位寄存器的潜在溢出(虽然这里不会,但养成习惯)。
- 添加了
newline变量,简化换行操作。 - 新增了十进制转ASCII的逻辑:通过除法拆分十位和个位,用栈保存逆序的数字,再依次弹出输出。
- 补全了最小值和总和的输出代码,确保功能完整。
内容的提问来源于stack exchange,提问作者Zahra
相关产品推荐
相关产品推荐

