;8086汇编语言,32位无符号整数
;从键盘输入四位十六进制数,将其变换成十进制数显示出来。
DATA SEGMENT ;数据段
STRING DB 'INPUT 4 HEX NUMBERS:','$'
ONELINE DB 0DH,0AH,'$'
ER_MSG DB 'WRONG NUMBERS','$'
INPUT DB 5 ;键盘最多输入4个字符
DB 0 ;记录实际输入多少个字符
DB 0,0,0,0,0 ;缓存,用于存放4个字符
RESULT DB 0,0,0,0,0,'$'
DATA ENDS
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,STRING
MOV AH,9
INT 21H
LEA DX,INPUT
MOV AH,0AH ;键盘输入字符串
INT 21H
LEA DX,ONELINE
MOV AH,9
INT 21H
LEA BX,INPUT+2
CALL ASC_BIN ;ASCII码转换为二进制数
JC ERROR_NUM
LEA BX,RESULT+4
CALL HEX_BCD ;十六进制数转换为非压缩的BCD码
DISP_NEXT:
MOV DL,[BX]
CMP DL,'$'
JE TO_EXIT
ADD DL,30H
MOV AH,2
INT 21H
INC BX
JMP DISP_NEXT
ERROR_NUM:
LEA DX,ER_MSG
MOV AH,9
INT 21H
TO_EXIT:
MOV AH,4CH ;返回DOS
INT 21H
;子过程功能:将四位ASCII码表示的十六进制数转换为两字节表示的二进制数。
;入口参数:DS:BX 指向数据区中存放ASCII码的首地址。
;出口参数:AX 存放转换后的二进制数。CF存返回标志,CF=0 表示转换成功,
;CF=1 表示转换不成功,数据区中有非十六进制数的ASCII码。
ASC_BIN PROC
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV SI,BX
MOV CX,4
ASC_BIN_NEXT:
MOV AL,[BX]
CMP AL,'0'
JB ASC_BIN_ERROR
CMP AL,'9'
JA CHECK_UPPER
SUB AL,30H
JMP GO_ON
CHECK_UPPER:
CMP AL,'A'
JB ASC_BIN_ERROR
CMP AL,'F'
JA CHECK_LOWER
SUB AL,37H
JMP GO_ON
CHECK_LOWER:
CMP AL,'a'
JB ASC_BIN_ERROR
CMP AL,'f'
JA ASC_BIN_ERROR
SUB AL,57H
GO_ON:
MOV [BX],AL
INC BX
LOOP ASC_BIN_NEXT
MOV BX,SI
XOR AX,AX
MOV CL,4
MOV DL,[BX]
SHL DL,CL
MOV AH,DL
MOV DL,[BX+1]
OR AH,DL
MOV DL,[BX+2]
SHL DL,CL
MOV AL,DL
MOV DL,[BX+3]
OR AL,DL
CLC ;进位标志清零,CF=0
JMP ASC_BIN_EXIT
ASC_BIN_ERROR:
STC ;进位标志置1,CF=1
ASC_BIN_EXIT:
POP SI
POP DX
POP CX
POP BX
RET
ASC_BIN ENDP
;子过程功能:将一个两字节的十六进制数转换为非压缩的BCD码。
;入口参数:AX 中存放要转换的十六进制数。
;DS:BX 指向数据区中存放非压缩BCD码的末地址(即个位地址)。
;出口参数:DS:BX 指向数据区中存放非压缩BCD码的首地址
HEX_BCD PROC
PUSH AX
PUSH CX
PUSH DX
MOV DX,0
MOV CX,10
HEX_BCD_NEXT:
DIV CX ;除以10,得到余数
MOV [BX],DL
CMP AX,0
JZ HEX_BCD_EXIT
DEC BX
MOV DX,0
JMP HEX_BCD_NEXT
HEX_BCD_EXIT:
POP DX
POP CX
POP AX
RET
HEX_BCD ENDP
CODE ENDS
END START