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

汇编程序求和异常排查:读取4整数求最小及求和大于9结果错误

问题分析

你遇到的核心问题是混淆了寄存器的二进制存储和十进制解读,以及缺少多位数十进制转ASCII的处理:

  • 9+9的十进制是18,对应十六进制是12H,BH寄存器里存的12是十六进制值,实际就是十进制的18,数值本身是对的,但你误以为是十进制的12。
  • 错误出在后续输出环节(你代码里没贴输出总和的部分),如果直接把BH里的数值转ASCII输出,会因为没有拆分十位和个位,导致显示错误。
解决方案
  1. 保持总和的二进制累加逻辑(这部分是对的),建议用16位寄存器(比如AX)存储总和,避免溢出(虽然4个0-9的数总和最大36,8位足够,但16位更稳妥)。
  2. 输出总和前,需要把二进制数值转换成十进制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:15:01