;citim n si calculam n!
;daca n este negativ afisam mesaj de eroare
;daca n! genereaza overflow afisam mesaj de eroare
includelib libcmt.lib
includelib legacy_stdio_definitions.lib
printf proto
scanf  proto
.DATA
n	        SQWORD	?
read_prompt  BYTE "Dati numarul n:",0
read_fmt     BYTE "%lld",0
error_neg   BYTE "Numarul este negativ!",0ah,0
error_overflow BYTE "Overflow!",0ah,0
print_result BYTE "%lld!=%lld",0ah,0
.CODE
main PROC
;citim cu prompt n
sub rsp,40
lea rcx,read_prompt
call printf

lea rcx,read_fmt
lea rdx,n
call scanf
;daca n<0 afisam mesaj de eroare
cmp n,0
jge efect_calc
;daca nu se efectueaza saltul, afisam mesaj de eroare
   lea rcx,error_neg
   call printf
   jmp final
efect_calc:
;calculam n! in rax
mov rax,1
mov rcx,1
;do { rax = rax * rcx; rcx++} while(rcx<=n)
beg_while:
    imul rcx
    ;testam daca inmultirea a generat overflow
    jno cont_calcul
        ;daca s-a generat overflow, afisam mesaj si iesim
        lea rcx,error_overflow
        call printf
        jmp final
cont_calcul:
    inc rcx
    cmp rcx,n
    jle beg_while
;n! se va afla in rax
;printf("%lld!=%lld",n,rax)
lea rcx,print_result
mov rdx,n
mov r8,rax
call printf

final:
add rsp,40
ret
main ENDP
END