6.从键盘上接收一个4位十六进制数,然后在显示器上显示其对应的16位二进制数。
;从键盘上接收一个4位十六进制数,然后在显示器上显示其对应的16位二进制数。
;该程序可以判断判断输入数据是否合法,可以根据需要进行重新输入或者退出
;需要注意输入字符后如果需要输出需要提前保存AL避免被改变
DATAS SEGMENT
MSG1 DB 'INPUT YOUR NUMBER:','$'
MSG2 DB 'RESULT:','$'
MSG3 DB 'INCORRECT INPUT DATA',0DH,0AH,'$'
MSG4 DB 'CLICK ESC TO STOP OR OTHER TO AGAIN',0DH,0AH,'$'
DATAS ENDS
OUTPUT MACRO ASC
MOV DL,ASC
MOV AH,02H
INT 21H
ENDM ;输出单字符
CRLF MACRO
OUTPUT 0DH
OUTPUT 0AH
ENDM ;输出回车、换行
TIP MACRO ASC
LEA DX,ASC
MOV AH,09H
INT 21H
ENDM ;输出字符串提示
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR ;主程序
MOV AX,DATAS
MOV DS,AX
CALL INPUT
CALL SHOW_RESULT
CALL EXIT
MAIN ENDP
INPUT PROC ;输入子程序
MOV BX, 0 ;用于存放四位的16进制数
MOV CH, 4 ;输入个数的计数器
MOV CL, 4 ;控制移位个数
TIP MSG1
ENTRY:
SHL BX, CL ;将已经输入的数左移4位
MOV AH, 01H ;接收键盘输入
INT 21H
CMP AL, 30H
JB ERROR ;输入数小于0,出错退出
CMP AL, 39H
JA AF ;不是,转‘A~F’的处理
AND AL, 0FH ;把ASCII码转换为
JMP NEXT
AF:
AND AL, 11011111B ;为了便于比较输入字符是否在符合范围内需要统一
;转换为大写字母
CMP AL, 41H ;判断小于A吗?
JB ERROR ;不是‘A~F’的数重新输入
CMP AL, 46H ;判断大于F吗?
JA ERROR ;不是‘A~F’的数重新输入
AND AL, 0FH ;转换为:1010B~1111B
ADD AL, 9
NEXT:
OR BL, AL ;将键盘输入的数加入BX中
DEC CH
JNZ ENTRY ;判断是否已经输完四个数
RET
ERROR:
CALL ERROR
INPUT ENDP
SHOW_RESULT PROC
CRLF
TIP MSG2 ;输出转换结果提示信息
MOV CL, 16 ;将16位二进制数一位位地转换成ASCII码显示
DISP:
MOV AL,04H ;没输出四位便输出一个空格
PUSH AX
OUTPUT 0H ;输出空格
POP AX
DISP1:
SHL BX,1
JNC ZERO
JMP ONE
NEXT:
DEC CL
CMP CL,0
JE RETURN
DEC AL
CMP AL,0
JE DISP
JMP DISP1
ZERO: ;输出0
PUSH AX
OUTPUT 30H
POP AX
JMP NEXT
ONE: ;输出1
PUSH AX
OUTPUT 31H
POP AX
JMP NEXT
RETURN:
RET
SHOW_RESULT ENDP
ERROR PROC ;输入错误处理子程序
CRLF
TIP MSG3
TIP MSG4 ;输出提示信息
MOV AH,07H
INT 21H
PUSH AX
CRLF
CRLF
POP AX
CMP AL,1BH
JNZ BEGINS ;如果输入ESC则结束程序,否则重新进行输入
JMP STOP
BEGINS:
CALL MAIN
STOP:
CALL EXIT
ERROR ENDP
EXIT PROC ;程序退出
MOV AH,4CH
INT 21H
EXIT ENDP
CODES ENDS
END MAIN