.MODEL SMALL .STACK 100H .DATA PROMPT_1 DB \'Enter a Binary number (max 16-bit) : $\' PROMPT_2 DB 0DH,0AH,\'The equivalent Decimal number is : $\' ILLEGAL DB 0DH,0AH,\'Illegal character. Try again : $\' .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 CALL BINARY_INPUT ; call the procedure BINARY_INPUT LEA DX, PROMPT_2 ; load and display the string PROMPT_2 MOV AH, 9 INT 21H MOV AX, BX ; set AX=BX CALL OUTDEC ; call the procedure OUTDEC MOV AH, 4CH ; return control to DOS INT 21H MAIN ENDP ;------------------------- Procedure Definitions ------------------------; ;---------------------------- BINARY_INPUT ------------------------------; BINARY_INPUT PROC ; this procedure will read a number in binary form ; input : none ; output : store binary number in BX ; uses : MAIN JMP @AGAIN ; jump to label @AGAIN @ERROR: ; jump label LEA DX, ILLEGAL ; load and display the string ILLEGAL MOV AH, 9 INT 21H @AGAIN: ; jump label MOV CX, 16 ; initialize loop counter XOR BX, BX ; clear BX MOV AH, 1 ; set input function @INPUT: ; loop label INT 21H ; read a digit CMP AL, 0DH ; compare input and CR JE @END ; jump to label @END if input is CR CMP AL, 30H ; compare AL with 0 JL @ERROR ; jump to label @ERROR if AL<0 CMP AL, 31H ; compare AL with 1 JG @ERROR ; jump to label @ERROR if AL>1 AND AL, 0FH ; convert ascii to decimal code SHL BX, 1 ; shift BX by 1 position towards left OR BL, AL ; place the input decimal digit in BL LOOP @INPUT ; jump to label @INPUT if CX!=0 @END: ; jump label RET ; return control to the calling procedure BINARY_INPUT ENDP ;------------------------------- OUTDEC ---------------------------------; OUTDEC PROC ; this procedure will display a decimal number ; input : AX ; output : none ; uses : MAIN PUSH BX ; push BX onto the STACK PUSH CX ; push CX onto the STACK PUSH DX ; push DX onto the STACK CMP AX, 0 ; compare AX with 0 JGE @START ; jump to label @START if AX>=0 PUSH AX ; push AX onto the STACK MOV AH, 2 ; set output function MOV DL, \"-\" ; set DL=\'-\' INT 21H ; print the character POP AX ; pop a value from STACK into AX NEG AX ; take 2\'s complement of AX @START: ; jump label XOR CX, CX ; clear CX MOV BX, 10 ; set BX=10 @REPEAT: ; loop label XOR DX, DX ; clear DX DIV BX ; divide AX by BX PUSH DX ; push DX onto the STACK INC CX ; increment CX OR AX, AX ; take OR of Ax with AX JNE @REPEAT ; jump to label @REPEAT if ZF=0 MOV AH, 2 ; set output function @DISPLAY: ; loop label POP DX ; pop a value from STACK to DX OR DL, 30H ; convert decimal to ascii code INT 21H ; print a character LOOP @DISPLAY ; jump to label @DISPLAY if CX!=0 POP DX ; pop a value from STACK into DX POP CX ; pop a value from STACK into CX POP BX ; pop a value from STACK into BX RET ; return control to the calling procedure OUTDEC ENDP END MAIN