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
相关产品推荐
相关产品推荐

