EMU8086汇编统计二进制0的个数错误输出总位数问题排查
问题原因分析
你的代码存在4个核心错误导致统计结果不符合预期:
- 二进制输出逻辑结束后直接跳转
exit,当二进制末位为0时,统计0个数的代码从未被执行 - emu8086的
scan_num宏会把用户输入的十进制数存在cx寄存器中,统计逻辑错误使用未存储输入值的ax寄存器做移位,数据源完全错误 - 统计逻辑缺失位值判断步骤:每次循环移位后没有判断当前位是否为0,不管位值直接累加
bx,最终必然输出总位数16 - 统计前没有初始化
bx为0,寄存器残留的脏数据会导致结果偏差
修复后的完整代码
include "emu8086.inc" .model small .stack 100h .data zeroes dw ? .code ; 第一部分:用户输入十进制数,输出16位二进制 mov ax, @data mov ds, ax call scan_num printn print "The binary is: " mov bx, 16 _loop: shl cx, 1 jc bin_1 putc '0' dec bx jnz _loop jmp count_zero ; 原来的jmp exit替换为跳转到统计逻辑 bin_1: putc '1' dec bx jnz _loop count_zero: ; 第二部分:统计二进制中0的个数 mov cx, 16 mov bx, 0 ; 初始化0的计数为0 up: rol cx, 01h jc next ; 当前位为1则跳过计数 inc bx ; 当前位为0则计数加1 next: loop up mov zeroes, bx printn print "The number of 0s: " mov ax, bx call print_num exit: mov ah, 4ch int 21h ; 导入库函数定义 define_print_num define_print_num_uns define_scan_num
关键修改说明
- 将二进制输出末尾的
jmp exit替换为跳转到统计逻辑,确保所有场景下统计代码都能正常执行 - 统计逻辑改用存储了用户输入值的
cx寄存器进行移位操作,数据源正确 - 增加进位标志判断:移位后如果进位标志为1说明当前位是1,跳过计数;进位标志为0说明当前位是0,累加计数
- 统计前初始化
bx为0,避免寄存器残留脏数据影响计数结果
内容的提问来源于stack exchange,提问作者nxd
相关产品推荐
相关产品推荐

