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

寄存器加法程序结果超20显示乱码,求错误原因

问题分析与解决

错误原因

  • 误用aaa指令
    aaa是非压缩BCD码加法调整指令,要求参与运算的操作数必须是非压缩BCD格式:每个字节仅低4位存储0-9的数字,高4位为0(比如数字10需表示为AH=01、AL=00,而非AX=000AH)。但你的代码中直接将普通二进制数传入aaa,当加法结果超过20时,调整后的寄存器值完全不符合十进制位的预期,转ASCII后自然输出乱码。

举个反例,计算11+10=21时:

  1. add ax,bx后AX=0015H(对应十进制21)
  2. 执行aaa:由于AL的高4位为1(不符合非压缩BCD要求),指令会将AL调整为05H,AH加1变为01H,最终AX=0105H
  3. 你将BX=AX后,BH=01H、BL=05H,加48后得到BH=49(对应字符'1')、BL=53(对应字符'5'),输出结果为"15",完全偏离正确值21。

正确实现方案

方案1:除法分解十进制位(推荐)

通过将二进制结果除以10,分离出十位和个位,再分别转ASCII输出:

mov ax, 15
mov bx, 10

add ax, bx  ; AX存储加法结果(此处为25)

mov cx, 10
div cx      ; AX除以10,AL=商(十位数字),AH=余数(个位数字)

; 输出十位
mov dl, al
add dl, 48  ; 转ASCII
mov ah, 02h
int 21h

; 输出个位
mov dl, ah
add dl, 48  ; 转ASCII
mov ah, 02h
int 21h

方案2:正确使用BCD调整指令

先将数值转为非压缩BCD格式,再执行加法和调整:

mov ax, 0105h  ; 非压缩BCD表示15(AH=01对应十位1,AL=05对应个位5)
mov bx, 0100h  ; 非压缩BCD表示10(BH=01对应十位1,BL=00对应个位0)

add al, bl     ; 先计算个位相加
aaa            ; 调整个位的非压缩BCD结果
mov cl, al     ; 保存个位结果

add ah, bh     ; 计算十位相加(若个位调整有进位,AH已自动加1)
mov ch, ah     ; 保存十位结果

; 输出十位
mov dl, ch
add dl, 48
mov ah, 02h
int 21h

; 输出个位
mov dl, cl
add dl, 48
mov ah, 02h
int 21h

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:02:16