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
相关产品推荐
相关产品推荐

