.MODEL SMALL .STACK 100H .DATA PROMPT_1 DB \'Enter a Positive Binary number (max. 1000) : $\' PROMPT_2 DB 0DH,0AH,\'The Factorial of the given 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 CALL FACTORIAL ; call the procedure FACTORIAL LEA DX, PROMPT_2 ; load and display the string PROMPT_2 MOV AH, 9 INT 21H CALL BINARY_OUTPUT ; call the procedure BINARY_OUTPUT 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 BL ; uses : MAIN JMP @START ; jump to label @START @ERROR: ; jump label LEA DX, ILLEGAL ; load and display the string ILLEGAL MOV AH, 9 INT 21H @START: ; jump label MOV CX, 4 ; 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 BL, 1 ; shift BL 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 ;---------------------------- BINARY_OUTPUT -----------------------------; BINARY_OUTPUT PROC ; this procedure will display a number in binary form ; input : BX ; output : none ; uses : MAIN MOV CX, 16 ; initialize loop counter MOV AH, 2 ; set output function @OUTPUT: ; loop label SHL BX, 1 ; shift BX by 1 position towards left JC @ONE ; jump to label @ONE if CF=1 MOV DL, 30H ; move 0 to DL JMP @DISPLAY ; jump tp label @DISPLAY @ONE: ; jump label MOV DL, 31H ; move 1 to DL @DISPLAY: ; jump label INT 21H ; display a digit LOOP @OUTPUT ; jump to label @OUTPUT if CX!=0 RET ; return control to the calling procedure BINARY_OUTPUT ENDP ;----------------------------- FACTORIAL --------------------------------; FACTORIAL PROC ; this procedure will computes the factorial of a given number ; input : BL ; output : store the factorial of the number in BX ; uses : MAIN MOV AX, 1 ; set AX=1 XOR CX, CX ; clear CX MOV CX, BX ; set CX=BX @LOOP: ; loop label MUL CX ; multiply CX with AL i.e. AX=AL*CX LOOP @LOOP ; jump to label @LOOP if CX!=0 MOV BX, AX ; set BX=AX RET ; return control to the calling procedure FACTORIAL ENDP END MAIN