; Esercizio 8
;
; La locazione di nome ENNE contiene un numero unsigned N > 0.
; Nella doppia locazione di nome FAT viene lasciato il fattoriale di N.
; Nella locazione di nome ERROR viene lasciato 1 o 0 a seconda che si sia
; avuto o no traboccamento nel calcolo del fattoriale.
;
.MODEL	small
.stack	100h

.data 
    enne db 5 ; Numero N di cui calcolare il fatt.
    fatt dw 0 ; Risultato del fattoriale
    error db 0
    pkey db "press any key...$"

.code
start:
	mov		ax,@data		; Get the address of the data segment
	mov		ds,ax			; Set the DS segment

    ; Inizio esercizio
    mov bl, enne    ; imposto bx con il
    mov bh, 0       ; valoredi n
    mov dx, 0       ; imposto a 1 il primo moltiplicatore
    mov ax, 1       ; in dx,ax
ciclo:
    mul bx          ; (dx ax) = ax * bx
    jc traboccamento  ; se CF = 1 allora ho errore
    dec bl          ; Decremento il moltiplicatore
    jnz ciclo       ; se non e' nullo proseguo con le moltiplicazioni
    mov fatt, ax    ; Copio il risultato finale in fatt
    jmp fine        ; salto alla fine

traboccamento:
    mov error, 1
                
fine:
    ; Fine esercizio ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	mov	dx,offset pkey	; Get the address of our message in the DX
	mov	ah,9			; Function 09h = "WRITE STRING TO STANDARD OUTPUT"
	int	21h				; Call the DOS interrupt (DOS function call)
	mov	ax,0C07h		; Function 0Ch = "FLUSH BUFFER AND READ STANDARD INPUT"
	int	21h				; Waits for a key to be pressed.
	mov	ax, 4C00h		; the exit fuction  [4C+no error (00)]
	int	21h				; call DOS interrupt 21h
end start ; set entry point and stop the assembler.