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

计算整数奇数十进制数位占比的汇编宏代码纠错求助

原代码核心错误点

  • 段定义顺序错误,可执行指令写到了.data段区域,运行时会触发异常
  • 核心逻辑颠倒:整数除以10后,余数才是当前待判断奇偶的数位,商才是下一轮循环的输入值,原代码把两者完全搞反
  • 数位总数硬编码为5,更换输入数字就会出错,没有动态统计总位数
  • 没有按要求封装为MACRO结构,不符合需求定义
  • 程序没有正常退出逻辑,执行完输出后会跑飞
  • 输出的分隔符错误用了逗号,且输出数值没有加ASCII偏移,直接输出数字会显示不可见字符

修正后完整代码

.model small
.stack 100h
.data
.code
; 宏定义:接收一个16位整数参数,计算奇数数位占比并输出(保留1位小数)
CALC_ODD_RATIO MACRO num
    LOCAL start_loop, is_odd, not_odd, end_loop
    ; 保存上下文寄存器
    push ax
    push bx
    push cx
    push dx
    push si
    ; 初始化计数器:cx=奇数个数,bx=总位数
    mov cx, 0
    mov bx, 0
    mov ax, num
start_loop:
    cmp ax, 0
    je end_loop
    inc bx              ; 总位数+1
    ; 除以10取余数(当前数位)
    mov dx, 0
    mov si, 10
    div si
    ; 判断数位是否为奇数
    test dl, 1
    jz not_odd
is_odd:
    inc cx              ; 奇数计数+1
not_odd:
    ; 商作为下一轮待处理数
    jmp start_loop
end_loop:
    ; 输出 0. 前缀
    mov dl, '0'
    mov ah, 02h
    int 21h
    mov dl, '.'
    int 21h
    ; 计算小数点后1位:(奇数个数*10)/总位数
    mov ax, cx
    mov si, 10
    mul si
    div bl
    add al, '0'         ; 转ASCII码
    mov dl, al
    int 21h
    ; 输出换行
    mov dl, 0dh
    int 21h
    mov dl, 0ah
    int 21h
    ; 恢复上下文寄存器
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
ENDM

main:
    mov ax, @data
    mov ds, ax
    ; 传入参数73458调用宏,输出结果为0.6
    CALC_ODD_RATIO 73458
    ; 程序正常退出
    mov ah, 4ch
    int 21h
end main

代码说明

  • 宏内部使用LOCAL声明局部标签,避免多次调用宏时出现标签重复定义错误
  • 同时动态统计奇数个数和数位总个数,支持任意16位无符号整数输入
  • 用test指令判断数位奇偶,比除法运算效率更高
  • 计算占比时先将奇数个数乘以10再除以总位数,直接得到小数点后一位的数值,符合示例要求
  • 宏调用时直接传入整数参数即可,无需额外操作
  • 新增了程序正常退出逻辑,不会出现执行后跑飞的问题

内容的提问来源于stack exchange,提问作者Black White

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:08