5.从键盘上输入一个8位二进制数,在显示器上显示其相应的十六进制数。

;从键盘上输入一个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

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