寄存器加法程序结果超20显示乱码,求错误原因
问题分析与解决
错误原因
- 误用
aaa指令aaa是非压缩BCD码加法调整指令,要求参与运算的操作数必须是非压缩BCD格式:每个字节仅低4位存储0-9的数字,高4位为0(比如数字10需表示为AH=01、AL=00,而非AX=000AH)。但你的代码中直接将普通二进制数传入aaa,当加法结果超过20时,调整后的寄存器值完全不符合十进制位的预期,转ASCII后自然输出乱码。
举个反例,计算11+10=21时:
add ax,bx后AX=0015H(对应十进制21)- 执行
aaa:由于AL的高4位为1(不符合非压缩BCD要求),指令会将AL调整为05H,AH加1变为01H,最终AX=0105H - 你将
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
相关产品推荐
相关产品推荐

