8086汇编十进制转二进制程序输出异常问题求助
8086汇编十进制转二进制程序输出异常问题求助
看起来你的程序在处理大于2559的数字时出现了计算错误,核心问题出在输入阶段的乘法指令使用不当,导致数字超过255后高位被意外丢弃了。我来帮你拆解问题并给出修复方案:
问题根源分析
你在输入处理部分用了mul bl(8位乘法),但number是16位的dw类型。8086的mul bl指令是将AL(AX的低8位)与BL相乘,结果存回AX——这意味着当number的值超过255时,AX的高8位(AH)会被完全忽略,直接用AL去乘10,结果自然就错了。
举个例子,当你输入到数字256时:
number的值是256(十六进制0100h),此时AX =0100h- 执行
mul bl(BL=10)时,只有AL(00h)参与计算,得到AX =0000h - 后续加上输入的0,
number就变成了0,所以转换二进制时自然输出空
修复方案
1. 替换8位乘法为16位乘法
把输入部分的8位寄存器BL换成16位的BX,同时用mul bx(16位乘法)来计算,这样就能完整保留16位的数值:
修改这部分代码:
; 原代码 mov bl, 10 input: mov dx, 0 mov ah, 1 int 21h cmp al, 13 je next sub al, 48 mov ah, 0 mov dx, ax mov ax, number mul bl add ax, dx mov number, ax jmp input
改成:
mov bx, 10 ; 用16位寄存器BX存乘数10 input: mov ah, 1 int 21h cmp al, 13 je next sub al, 48 mov ah, 0 mov cx, ax ; 用CX暂存输入的数字(避免和DX冲突) mov ax, number mul bx ; 16位乘法,DX:AX = number * 10 add ax, cx ; 加上输入的数字 mov number, ax jmp input
(这里把DX换成CX是因为mul bx会修改DX寄存器,避免覆盖输入的数字)
2. 处理输入0的特殊情况
现在修复后2560能正常输出101000000000了,但如果输入0,程序还是会输出空。可以在打印前加一段判断,当没有二进制位需要打印时(CX=0),主动输出一个0:
在msg标签后、printing标签前添加:
msg: mov ah, 9 lea dx, message2 int 21h ; 新增:判断是否为0的情况 cmp cx, 0 jne printing mov dl, '0' mov ah, 2 int 21h jmp the_end printing: ; 原打印代码不变
测试验证
修复后再测试:
- 输入2560,会输出
101000000000 - 输入0,会输出
0 - 输入2561,会输出
101000000001,和预期一致
备注:内容来源于stack exchange,提问作者tomas8794
相关产品推荐
相关产品推荐

