;calculam suma 1^2 + ... + n^2
;n este citit de la tastatura
;daca n<=0 afisam mesaj de eroare 
includelib libcmt.lib
includelib legacy_stdio_definitions.lib
printf proto
scanf  proto
.DATA
n	SQWORD	?
read_prompt byte "Dati numarul:",0
read_fmt byte "%lld",0
error_msg BYTE "eroare: %lld < 0 ",0ah,0
print_sum BYTE "1^2+...+%lld^2=%lld",0ah,0

.CODE
main PROC
;printf("Dati numarul:")
;arg. printf este transmis prin rcx
sub rsp,40
lea rcx,read_prompt
call printf

;scanf("%lld",&n)
;formatul este transmis prin rcx
;rdx primeste adresa lui n
lea rcx,read_fmt
lea rdx,n
call scanf
add rsp,40


cmp n,0
jnl calcul_suma 
    ;daca n<0 afisam mesaj de eroare
    sub rsp,40
    lea rcx,error_msg
    mov rdx,n
    call printf
    add rsp,40
    jmp final

calcul_suma:
;rcx=0; rax=1; while{rax<=n) { rcx = rcx + rax * rax; rax++;}
mov rbx,0
mov rcx,1
;indicele se afla in rcx, rax va fi folosit pt a calcula patratele
;suma este in rbx
beg_while:
  cmp rcx,n
  jg end_while
  mov rax,rcx
  imul rax
  add rbx,rax
  add rcx,1
  jmp beg_while
end_while:
;afisam rezultatul
sub rsp,40
lea rcx,print_sum
mov rdx,n
mov r8,rbx
call printf
add rsp,40
final:
ret
main ENDP
END
