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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:58:03