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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:15:03