# Program that will read a positive binary number and print its factorial in binary form using MUL instruction ( suppose that there is no overflow )

``` .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

@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

CMP AL, 30H                  ; compare AL with 0

CMP AL, 31H                  ; compare AL with 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

@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
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

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

MOV BX, AX                     ; set BX=AX

RET                            ; return control to the calling procedure
FACTORIAL ENDP

END MAIN
```