1. 程式人生 > 實用技巧 >6.從鍵盤上接收一個4位十六進位制數,然後在顯示器上顯示其對應的16位二進位制數。

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