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



posted @ 2020-10-26 10:24  不知道说什么才好  阅读(859)  评论(0编辑  收藏  举报