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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:43:19