如何在汇编语言中显示总和?汇编程序仅显奇偶未显总和问题
解决汇编程序无法显示学号数字总和的问题
问题分析与修复步骤
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
相关产品推荐
相关产品推荐

