;从键盘上输入一个8位二进制数,在显示器上显示其相应的十六进制数。
DATA SEGMENT
MSG1 DB 'Input binary number(ESC to exit):','$'
MSG2 DB 0AH,0DH,'Input error!',0AH,0DH,'$'
MSG3 DB 'RESULT:','$'
DATA ENDS
C_OUTPUT MACRO ASC ;定义输出一个字符的宏
MOV DL, ASC
MOV AH, 02H
INT 21H
ENDM
S_OUTPUT MACRO ASC
MOV DX,ASC
MOV AH,09H
INT 21H
ENDM
CRLF MACRO
C_OUTPUT 0AH
C_OUTPUT 0DH
ENDM
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
MAIN PROC FAR
MOV AX, DATA
MOV DS, AX ;初始化DS
BEGIN:
LEA AX, MSG1
S_OUTPUT AX
MOV CX, 8 ;输入 8 位二进制数
MOV BL, 0 ;通过BL保存输入的八位数,这里通过循环进行输入保存巧妙
INPUT:
MOV AH, 01H
INT 21H ;输入一个数并回显
SHL BL, 1
CMP AL, 1BH
JZ EXIT ;ESC 键退出
CMP AL, 30H ;输入“0”
JZ NEXT
CMP AL, 31H ;输入“1”
JNZ ERROR ;输入其他则出错
INC BL
NEXT:
LOOP INPUT
CRLF
LEA AX,MSG3
S_OUTPUT AX
SHOW:
PUSH BX ;将八位二进制数入栈保存
MOV CL, 4
SHR BL, CL
CALL TRAN ;显示高 4 位对应的 16 进制数
POP BX
AND BL, 0FH
CALL TRAN ;显示低 4 位对应的 16 进制数
C_OUTPUT 'H'
CRLF
CRLF
JMP BEGIN
ERROR:
LEA AX, MSG2
S_OUTPUT AX
JMP BEGIN
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
TRAN PROC
CMP BL, 0AH ;判断四位二进制对应的十六进制数是否大于10
JB BELOW
ADD BL, 7 ;跳过9的ASCII码后面的七个ASCII码
BELOW:
ADD BL, 30H ;加上30h后是其ASCII码
C_OUTPUT BL
RET
TRAN ENDP
CODE ENDS
END MAIN