|
|
.MODEL SMALL
.STACK 64
DATA SEGMENT
MSG1 DB 'ENTER A DIGIT > $'
NUM DB 00H
MSG2 DB '!=(hexadecimal) $'
MSG3 DB 'INVALID INPUT or OVERFLOW $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CALL CLS ;clears screen
MOV DX,0000H
CALL CURSOR ;set cursor at (0,0) for number
MOV AX,DATA
MOV DS,AX
CALL INPUT
CALL CLS
MOV DX,0000H
CALL CURSOR
CMP NUM,30H
JC INVALID
CMP NUM,39H
JNC INVALID
SUB NUM,30H
MOV CL,NUM ;CX=NUM
MOV CH,00H
MOV AX,0001H ;AX=1 (AX used to hold factorial value)
CALL FACT
PUSH AX
MOV AL,NUM ;print number
CALL PCHAR
MOV DX,0001H
CALL CURSOR ;set cursor at (1,0) for message
LEA DX,MSG2
MOV AH,09H
INT 21H
POP AX
PUSH AX
AND AX,0F000H
MOV CL,0CH
SHR AX,CL ;first digit
CALL PCHAR ;print first digit
MOV DX,0012H
CALL CURSOR ;set cursor at (18,0) for digit2
POP AX
PUSH AX
AND AX,0F00H
MOV AL,AH ;second digit
CALL PCHAR ;print second digit
MOV DX,0013H
CALL CURSOR ;set cursor at (19,0) for digit3
POP AX
PUSH AX
AND AX,00F0H
MOV CL,04H
SHR AX,CL ;third digit
CALL PCHAR ;print third digit
MOV DX,0014H
CALL CURSOR ;set cursor at (20,0) for digit4
POP AX
AND AX,000FH ;fourth digit
CALL PCHAR ;print fourth digit
JMP HALT
INVALID:LEA DX,MSG3
MOV AH,09H
INT 21H
HALT: MOV AX,4C00H ;terminate digit
INT 21H
;CLEARS SCREEN
CLS: MOV AX,0600H
MOV BH,07H
MOV CX,0000H
MOV DX,184FH
INT 10H
RET
;SETS CURSOR POSITION AT (DL,DH)
CURSOR: MOV AH,02H
MOV BH,00H
INT 10H
RET
INPUT: LEA DX,MSG1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV NUM,AL
RET
FACT: CMP CX,02H
JC EXIT
PUSH CX
DEC CX
CALL FACT
POP CX
MUL CX
EXIT: RET
;PRINTS CHARACTER AT CURRENT CURSOR POSITION
PCHAR: ADD AL,30H
CMP AL,3AH
JC L1
ADD AL,07H
L1: MOV AH,09H
MOV BX,0007H
MOV CX,01H
INT 10H
RET
CODE ENDS
END START
|
|
|