计算整数奇数十进制数位占比的汇编宏代码纠错求助
原代码核心错误点
- 段定义顺序错误,可执行指令写到了
.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
相关产品推荐
相关产品推荐

