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

如何在汇编语言中显示总和?汇编程序仅显奇偶未显总和问题

解决汇编程序无法显示学号数字总和的问题

问题分析与修复步骤

1. 奇数分支未调用总和显示函数

当前代码仅在偶数分支(even_num)中调用print_sum,奇数分支直接跳转至程序结束,导致奇数场景下完全不输出总和。

修复:修改print_result中的奇数分支逻辑,添加print_sum调用:

print_result:
    mov ah, 09h
    cmp di, 0
    je even_num
    mov dx, odd_msg             ; 显示奇数提示
    int 21h
    call print_sum              ; 新增:调用总和显示函数
    jmp end_program

even_num:
    mov dx, even_msg            ; 显示偶数提示
    int 21h
    call print_sum

2. 输出字符串缺少DOS中断要求的终止符

int 21h的09h功能要求字符串必须以$结尾,原代码仅转换数字未添加终止符,导致显示异常或无输出。

修复:在数字转换完成后,在字符串末尾添加$:

convert_loop:
    xor dx, dx                  ; 清零dx寄存器
    div bx                      ; ax除以10
    add dl, 48                  ; 余数转ASCII
    dec si                      ; 移动缓冲区指针
    mov [si], dl                ; 存储转换后的数字
    inc cx                      ; 统计数字位数
    test ax, ax
    jnz convert_loop            ; ax不为0则继续转换

    mov byte [si + cx], '$'     ; 新增:添加字符串终止符
    
    mov dx, si                  ; 指向转换后的数字起始位置
    ; 移除错误的add dx,1指令
    mov ah, 09h
    int 21h

3. 缓冲区初始化不规范

原代码output_buffer db 16仅定义单个字节为16,未分配足够的缓冲区空间,可能导致内存覆盖。

修复:改为分配16字节的空缓冲区:

output_buffer db 16 dup(0)     ; 分配16字节缓冲区,初始化为0

4. 函数未遵循寄存器保存规范(可选优化)

print_sum中修改了bx、cx等寄存器,虽然当前程序结束前不会影响逻辑,但遵循汇编规范需保存/恢复寄存器:

print_sum:
    push bx
    push cx
    push si
    push ax  ; 保存原始总和
    
    ; 原有逻辑...
    
    ; 恢复寄存器
    pop ax
    pop si
    pop cx
    pop bx
    ret

完整修复后的代码

org 100h

section .data
    roll_num db '210405702'     ; 学号字符串
    roll_len equ $ - roll_num   ; 学号长度
    sum_msg db 'The sum is: $'
    output_buffer db 16 dup(0)  ; 总和转换缓冲区
    odd_msg db 'The received number is odd', 0Dh, 0Ah, '$'
    even_msg db 'The received number is even', 0Dh, 0Ah, '$'

section .text
    global _start

_start:
    mov si, 0
    mov cx, 0
    
sum_loop:
    mov al, byte [roll_num + si]
    sub al, 48                  ; ASCII转十进制
    add cx, ax                  ; 累加总和到cx
    inc si
    cmp si, roll_len
    jl sum_loop
    
    mov ax, cx                  ; 总和移到ax用于奇偶判断
    
    test al, 1
    jz even
    
    mov di, 1
    jmp print_result

even:
    mov di, 0
    
print_result:
    mov ah, 09h
    cmp di, 0
    je even_num
    mov dx, odd_msg
    int 21h
    call print_sum
    jmp end_program

even_num:
    mov dx, even_msg
    int 21h
    call print_sum
    
end_program:
    mov ah, 4Ch
    xor al, al
    int 21h

print_sum:
    push bx
    push cx
    push si
    push ax
    
    mov ah, 09h
    mov dx, sum_msg
    int 21h
    
    mov bx, 10
    xor cx, cx
    mov si, output_buffer + 15
    
convert_loop:
    xor dx, dx
    div bx
    add dl, 48
    dec si
    mov [si], dl
    inc cx
    test ax, ax
    jnz convert_loop
    
    mov byte [si + cx], '$'
    
    mov dx, si
    mov ah, 09h
    int 21h
    
    pop ax
    pop si
    pop cx
    pop bx
    ret

内容的提问来源于stack exchange,提问作者bc210405702 UMER WAQAS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:37:21