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

8086编程中如何将AL寄存器内的十六进制值转换为十进制数

8086汇编AL寄存器十六进制值转十进制实现方法

AL是8位通用寄存器,其中存储的十六进制无符号数取值范围为00H~FFH,对应十进制0~255,转换的核心思路是逐位拆分出百位、十位、个位三个十进制位值,按需转成ASCII码即可用于显示、存储等后续操作。

核心转换步骤

  • 先清空AH寄存器,将AL中的8位数值扩展为16位存入AX,避免8位除法运算出错
  • 用AX除以100,得到的商就是百位的十进制数值,除法产生的余数为去掉百位后剩余的、小于100的数值
  • 用上一步得到的余数除以10,得到的商就是十位的十进制数值,最终的余数就是个位的十进制数值
  • 如果需要输出十进制字符,将三个位的数值分别加上30H(即十进制48,对应ASCII表中字符'0'的编码),就能得到对应数字的ASCII码

参考实现代码

; 入口参数:待转换的十六进制值预先存入AL
; 出口参数:DI指向的3字节缓冲区依次存储百位、十位、个位的ASCII码
HEX2DEC:
    XOR AH, AH      ; 清空AH,将AL零扩展为16位AX
    MOV BL, 100
    DIV BL          ; AX / 100,商存AL(百位),余数存AH
    MOV BH, AH      ; 暂存余数
    ADD AL, 30H     ; 百位数值转ASCII
    MOV [DI], AL    ; 写入缓冲区第一位
    MOV AL, BH      ; 加载余数准备拆分十位个位
    XOR AH, AH
    MOV BL, 10
    DIV BL          ; 余数值 / 10,商存AL(十位),余数存AH(个位)
    MOV CL, AH      ; 暂存个位
    ADD AL, 30H     ; 十位转ASCII
    MOV [DI+1], AL  ; 写入缓冲区第二位
    ADD CL, 30H     ; 个位转ASCII
    MOV [DI+2], CL  ; 写入缓冲区第三位
    RET

适配说明

  • 如果AL中存储的是有符号数,需要先判断AL最高位(D7位)的值:若为1代表是负数,先输出'-'字符,再对AL中的补码做取反加一操作得到绝对值,再走上述无符号转换流程即可
  • 如果不需要固定输出3位长度,可以在转换完成后遍历前导零,将开头的连续'0'替换为空格或者直接调整输出指针跳过前导零即可
  • 所有除法操作前必须保证AH的值符合被除数扩展要求,8位除法默认以AX整体作为被除数,AH残留的旧值会直接导致运算结果错误

内容的提问来源于stack exchange,提问作者Muhammad Zeeshan Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:39:20