8086汇编语言:为何无法输出整数42,反而显示0M?
8086汇编打印42却输出0M的问题排查与修复
核心错误分析
1. 除法指令类型误用
代码中使用了16位除法指令div bx,但实际处理的是8位数值(存于AL中的42):
- 8086的
div bx是16位除法规则:被除数为DX:AX的32位组合值,运算后商存入AX,余数存入DX。 - 代码仅初始化了AL为42,AH未做清零,属于随机值;DX虽被清零,但AX的高8位(AH)未知,导致被除数变成
0000h:XX2Ah(XX为AH随机值),除以10后得到的商和余数完全偏离预期。 - 正确操作是使用8位除法指令
div bl,此时被除数为AX(只需确保AH清零),商存入AL,余数存入AH,匹配代码后续取商、余数的逻辑。
2. 数字打印顺序颠倒
即使除法指令正确,代码的打印逻辑也会输出错误结果:
- 42除以10,商是4(十位数字),余数是2(个位数字),需先打印十位的4,再打印个位的2,才能得到"42"。
- 原代码先打印余数、再打印商,会输出"24"而非"42"。
3. AH未初始化导致随机值干扰
执行8位除法前未清零AH,AX会包含随机高8位值,同样会导致除法结果异常。
修正后的代码
TEST2 PROC mov arrCount[0], 42 mov al, arrCount[0] xor ah, ah ; 清零AH,确保AX为8位数值的16位合法扩展 mov bl, 10 ; 用8位寄存器存储除数,配合div bl执行8位除法 div bl ; 8位除法:AX/BL,商存AL(十位),余数存AH(个位) mov cl, al ; 暂存十位数字 mov ch, ah ; 暂存个位数字 ; 先打印十位数字 mov ah, 02h add cl, '0' mov dl, cl int 21h ; 再打印个位数字 mov ah, 02h add ch, '0' mov dl, ch int 21h ret TEST2 ENDP MAIN PROC FAR mov ax, @data mov ds, ax call TEST2 mov ax, 4c00h int 21h MAIN ENDP END MAIN
关键修正说明
- 将
mov bx,10改为mov bl,10,使用8位寄存器存储除数。 - 替换
div bx为div bl,执行符合需求的8位除法。 - 新增
xor ah, ah,确保AH清零,AX的值为合法的002Ah(十进制42)。 - 调整打印顺序,先输出商(十位)再输出余数(个位),匹配数字的正常显示逻辑。
内容的提问来源于stack exchange,提问作者Dylan Khor
相关产品推荐
相关产品推荐

