DATA SEGMENT
X DB 5, ?, 5 DUP(0)
XX DW 0 ; 将X完成拼接操作存入XX (将XX当作要被转换的数据处理)
Y DB 5 DUP(0) ; 存转换后的10进制数
STR1 DB 'INPUT 4 DIGITS: $'
STR2 DB 0AH, 0DH, 'THE BCD CODE IS: $' ; 实际打印出来的是BCD码表示的10进制数
STR3 DB 0AH, 0DH, 'INPUT ERROR! TRY AGAIN! $'
DATA ENDS
STACK SEGMENT PARA STACK
DW 20H DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET STR1
MOV AH, 09H
INT 21H
MOV DX, OFFSET X
MOV AH, 0AH
INT 21H
MOV DI, OFFSET X
INC DI
MOV BL, [DI]
CMP BL, 4 ; 检测输入是否为4位
JE NEXT
JMP ERROR
NEXT: INC DI
PUSH DI
CALL TES ; 检测输入有效性并转化ASCII为数字
POP DI
CALL CHANGE ; 将X按位拼接到XX中,使之成为长度为一个字的16进制数
MOV DX, XX
MOV DI, OFFSET Y
MOV CX, 0H ; 存放10进制数的位数
LOP2: MOV AX, DX ; 被除数放入AX
MOV DX, 0H
MOV BX, 10
DIV BX ; 除以10,余数在DX中,商在AX中
XCHG AX, DX ; 交换余数和商的位置
ADD AL, 30H ; 把余数转化为ASCII码
MOV [DI], AL ; 存余数
INC DI
INC CX ; 位数计数器加1
CMP DX, 0H ; 如果商为0,则输出
JNZ LOP2
MOV DX, OFFSET STR2
MOV AH, 09H
INT 21H
LOP3: DEC DI ; CX(10进制数的位数)控制此循环
MOV DL, [DI] ; 依次输出
MOV AH, 02H
INT 21H
LOOP LOP3
MOV DL, 'D'
INT 21H
JMP OVER
ERROR: MOV DX, OFFSET STR3
MOV AH, 09H
INT 21H
OVER: MOV AH, 4CH
INT 21H
TES PROC ; 检测与转换输入的子程序
MOV CX, 4
LOP0: MOV AX, 0
MOV AL, [DI] ; 判断输入的不同情况
CMP AL, '0'
JB ERROR
CMP AL, 'f'
JA ERROR
CMP AL, '9'
JBE PART1
CMP AL, 'A'
JB ERROR
CMP AL, 'F'
JBE PART2
CMP AL, 'a'
JB ERROR
CMP AL, 'f'
JBE PART2
PART1: AND AL, 0FH ; 开始转化为数值
MOV [DI], AL ; 替换原始ASCII码
JMP CONTINUE1
PART2: SUB AL, 07H
JMP PART1
CONTINUE1: INC DI
LOOP LOP0
RET
TES ENDP
CHANGE PROC
MOV BX, 0
MOV CX, 3 ; 总共移位3次,或运算拼接4次
LOP1: PUSH CX
OR BL, [DI]
MOV CL, 4
SHL BX, CL ; 左移4个2进制位(1个16进制位)
INC DI
POP CX
LOOP LOP1
OR BL, [DI] ; 多进行或运算一次
QUIT: MOV XX, BX ; 拼接完成存入BX
RET
CHANGE ENDP
CODE ENDS
END BEGIN