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

Emu8086存储8位二进制数问题:输入转换后寄存器值异常

问题分析与修正

错误原因

你的代码核心问题是最后一个输入的字符没有被写入CL寄存器:

  • 初始bl=8,每输入一个有效字符后先执行sub bl,1,再判断bl是否为0。
  • 当输入第8个字符时,sub bl,1后bl=0,直接跳转到exit,跳过了shl cl,1和add cl,al的操作,导致最后一位丢失。
  • 比如输入11000000,实际只处理了前7位1100000,移位后得到二进制01100000(即十六进制60h),和你看到的结果完全吻合。

另外,代码里的cmp al,46是多余的,46是字符.的ASCII码,这行判断后没有任何分支处理,直接执行sub al,30h,对逻辑毫无作用,建议删除。

修正后的代码

调整操作顺序,确保每一个有效输入都被写入寄存器,再判断循环是否结束:

mov cx,0
    mov bl,8
input:
    mov ah,07h
    int 21h

    ; 直接用字符常量判断,代码更易读
    cmp al,'0'
    je convert
    cmp al,'1'
    jne input  ; 非0非1重新输入
convert:
    sub al,30h  ; ASCII转数字0/1
    shl cl,1    ; CL左移一位,腾出最低位
    add cl,al   ; 将当前位写入CL最低位
    sub bl,1
    cmp bl,0
    jne input   ; 未完成8次输入则继续
exit:

逻辑说明

  • 每次输入有效字符后,先将其转换为数字0/1,再写入CL寄存器(左移+加法等价于将当前位拼接到二进制数的末尾)。
  • 写完寄存器后再减少计数bl,判断是否完成8次输入,确保8位字符全部被处理。
  • 输入11000000时,CL最终会得到二进制11000000,即十六进制C0h,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:46:26