.MODEL SMALL
.STACK 100H
.DATA
PROMPT_1 DB 'Enter the hexadecimal number ( max 4-digit ) : $'
PROMPT_2 DB 0DH,0AH,'The equivalent 16-bit binary number is : $'
ILLEGAL DB 0DH,0AH,'Illegal hex number. Try again : $'
COUNT DB ?
.CODE
MAIN PROC
MOV AX, @DATA ; initialize DS
MOV DS, AX
LEA DX, PROMPT_1 ; load and display the string PROMPT_1
MOV AH,9
INT 21H
JMP @START ; jump to label @START_2
@START_1: ; jump label
LEA DX, ILLEGAL ; load and display the string ILLEGAL
MOV AH, 9
INT 21H
@START: ;
XOR BX, BX ; clear BX
MOV COUNT, 30H ; initialize loop counter
@START_2: ; jump label
MOV AH, 1 ; set input function
INT 21H ; read a character
CMP AL, 0DH ; compare Al with CR
JNE @SKIP ; jump to label @SKIP if AL!=CR
CMP COUNT, 30H ; compare COUNT with 0
JBE @START_1 ; jump to label @START_1 if COUNT<=0
JMP @END ; jump to label @END
@SKIP: ; jump label
CMP AL, "A" ; compare AL with "A"
JB @DECIMAL ; jump to label @DECIMAL if AL<A
CMP AL, "F" ; compare AL with "F"
JA @START_1 ; jump to label @START_1 if AL>F
ADD AL, 09H ; add 9 to AL
JMP @OK ; jump to label @OK
@DECIMAL: ; jump label
CMP AL, 30H ; compare AL with 0
JB @START_1 ; jump to label @START_1 if AL<0
CMP AL, 39H ; compare AL with 9
JA @START_1 ; jump to label @START_1 if AL>9
@OK: ; jump label
INC COUNT ; increment the COUNT variable
AND AL, 0FH ; convert the ascii into binary code
MOV CL, 4 ; set CL=4
SHL AL, CL ; shift AL towards left by 4 positions
MOV CX, 4 ; set CX=4
@LOOP_1: ; loop label
SHL AL, 1 ; shift AL towards left by 1 position
RCL BX, 1 ; rotate BX towards left by 1 position
; through carry
LOOP @LOOP_1 ; jump to label @LOOP_1 if CX!=0
CMP COUNT, 34H ; compare COUNT with 4
JE @END ; jump to label @END if COUNT=4
JMP @START_2 ; jump to label @START_2
@END: ; jump label
LEA DX, PROMPT_2 ; load and display the string PROMPT_2
MOV AH, 9
INT 21H
MOV CX, 16 ; set CX=16
MOV AH, 2 ; set output function
@LOOP_2: ; loop label
SHL BX, 1 ; shift BX towards left by 1 position
JC @ONE ; jump to label @ONE if CF=1
MOV DL, 30H ; set DL=0
JMP @DISPLAY ; jump to label @DISPLAY
@ONE: ; jump label
MOV DL, 31H ; set DL=1
@DISPLAY: ; jump label
INT 21H ; display a character
LOOP @LOOP_2 ; jump to label @LOOP_2 if CX!=0
MOV AH, 4CH ; return control to DOS
INT 21H
MAIN ENDP
END MAIN