title Tinh N!
.model small   ;khai bao kieu bo nho loai Small
.stack 100h    ;khai bao kich thuoc ngan xep la 100h
.data
nhap db 'Nhap n (trong khoang tu 1 -> 8) = $'  ; khai bao chuoi ki tu hien ra man hinh
kqua db 10,13, 'N! = $'      ; khai bao chuoi ki tu in ra man hinh ket qua cua N!, voi  cac bien 10, 13 dung de xuong dong va hien ket qua o dau dong tiep theo
tbao1 db 10,13, 'Ki tu ban nhap khong thuoc so tu 1 ->8. Moi ban vui long nhap lai. $'
tbao2 db 10,13, 'Ban co muon chay them lan nua [Y/N]: $'
.code
Main proc
	mov ax, @data
	mov ds, ax
Nhaplai:
	mov ah, 9       ;Chuc nang so 9 cua ngat 21
	lea dx, nhap   ;Lay dia chi chuoi ki tu "nhap" dat vao dx
	int 21h           ;Goi ngat
	mov ah, 1      ;goi chuc nang nhap ki tu
	int 21h
	cmp al,'1'       ;so sanh al voi '1'
	jb kiemtra      ;va '8', neu al khong nam trong khoang 1-8
	cmp al,'8'       ; 
	ja kiemtra      ;thi nhay toi nhan kiemtra, 
	jmp xuly          ;neu nam trong doan 1-8 thi nhay toi nhay xu ly 
kiemtra:
	mov ah,9       ;Chuc nang so 9 cua ngat 21
	lea dx,tbao1   ;Lay dia chi chuoi ki tu "tbao1" dat vao dx
	int 21h            ;Goi ngat  
	
	mov ah,2;           chuc nang so 2
	mov dl, 0dh     ;  ve dau dong
	int 21h          ; Goi ngat 
	mov dl, 0Ah    ; xuong dong
	int 21h        ; Goi ngat 
	
	jmp Nhaplai    ;nhay toi nhan Nhaplai
xuly:
	call Giai_thua    ;goi thu tuc Giai_thua
	mov ah,9           ;Chuc nang so 9 cua ngat 21
	lea dx,tbao2      ;Lay dia chi chuoi ki tu "tbao2" dat vao dx
	int 21h               ;Goi ngat   
	
	mov ah,2;           chuc nang so 2
	mov dl, 0dh     ;  ve dau dong
	int 21h          ; Goi ngat 
	mov dl, 0Ah    ; xuong dong
	int 21h        ; Goi ngat 
	
	mov ah,1          ;Goi chuc nang nhap ki tu cua ngat 21h
	int 21h       
	
	
	cmp al,59h      ;so sanh al voi 59h
	je Nhaplai       ;neu al = 59h thi nhay toi nhan Nhaplai
	cmp al,4eh      ;so sanh al voi 4eh
	je Ketthuc      ;neu al = 4eh thi nhay toi nhan Ketthuc
Ketthuc:
	mov ah, 4Ch    ;Ket thuc
	int 21h
main endp                        ;ket thuc ham chinh trong chuong trinh
Giai_thua proc             ;thu tuc Giai_thua bat dau
        xor ah,ah         ;xoa ah de ax = al
	        sub al, 30h      ;chuyen ki tu thanh so
	        mov bx, ax     ;chuyen so trong ax vao bx    
             mov ax,1       ;dat gia tri trong ax = 1

tinh:   mul bx            ;thuc hien phap nhan bx voi ax, ket qua chua trong ax
	          dec bx             ;giam bx di 1 don vi
	          cmp bx,1        ;so sanh bx voi 1
	          ja tinh             ;neu bx > 1 thi tiep tuc nhan lap
		
xor dx, dx       ;xoa dx bang 0 de lay dx trong chua so du
		mov bx, 10     ;dat bx bang 10, dem ax chia cho bx
		mov cx, 0       ;xoa cx bang 0 de khoi tao bien dem bang 0

	chia:   div bx              ;  chia ax cho bx, thuong dat vao ax, so du dat vao dx
		push dx           ; day so du trong dx vao ngan xep
		xor dx,dx        ; xoa so du co trong dx de dung trong lan chia tiep theo
		inc cx              ; tang cx len 1
		cmp ax, 0        ; so sanh ax voi 0   
		ja chia             ; neu ax lon hon 0 thi nhay toi nhan chia
		
mov ah, 9
		lea dx, kqua    ;in ra man hinh chuoi ki tu "kqua" 
		int 21h
	inra:   pop dx             ; lay so ra khoi ngan xep va dat vao dx
		add dx,30h     ; doi so thanh ki tu
		mov ah,2        ; in ra man hinh ki tu
		int 21h           ;goi ngat 21h
	loop inra                    ;vong lap in ra
ret                                ;tro ve chuong trinh chinh
Giai_thua endp           ;ket thuc thu tuc Giai_thua
end main                        ;ket thuc chuong trinh


