通过查表的方法实现十六进制数转换为 ASCII 码。0~9 的 ASCII 码为 30H~39H,而 A~F 的 ASCII 码为 41H~46H,这样就可以将 0~9 与 A~F 对 应的 ASCII 码保存在一个数据表格中。
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
PUBLIC ASCH, ASCL, HEX ;定义全局变量
DATA SEGMENT ;十六进制数 0~9,A,B,C,D,E,F 对应 ASC 码表
TAB DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H
HEX DB ? ;待转换的十六进制数
ASCH DB ? ;高 4 位转换的 ASCII 码
ASCL DB ? ;低 4 位转换的 ASCII 码
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:SSTACK, DS:DATA
START: PUSH DS
XOR AX, AX
MOV AX, DATA
MOV DS, AX
AA1: MOV AL, HEX ;需转换的十六进制数
MOV AH, AL
AND AL, 0F0H
MOV CL, 04H
SHR AL, CL
MOV BX, OFFSET TAB ;表首地址存放于 BX 中
XLAT
MOV ASCH, AL ;存放十六进制数高 4 位的 BCD 码
MOV AL, AH
AND AL, 0FH
XLAT
MOV ASCL, AL ;存放十六进制数低 4 位的 BCD 码
NOP
JMP AA1 ;在此处设臵断点,观察转换结果
CODE ENDS
END START
代码分析:
1、备份原始的需要转换的十六进制数HEX值到AL AH当中,防止HEX丢失
2、此时AL,AH都存有HEX的值,将AL和F0H相与,然后就可以只保留AL的高四位,随后SHR使得高四位移动到低四位的位置,高位补0
3、将表首地址存放于BX当中,随后XLAT通过处理过的AL从TAB表中查找并获得行营的ASCII码,赋值给AL
4、将AL中的数值存入ASCH当中。
5、随后将储存好的AH的内容重新移入AL,使得AL当中依然保留HEX的值,然后重新实现以上查找表的功能。