%include "asm_io.inc"
	
SECTION .data
msg1:	db "Entrez un entier",10,0
msg2:	db 10,"Somme: ",0
	
blanc:	db ' '

SECTION .text		   	 	; section pour le code

	global 	main	    		; rend le label visible de l'extérieur
	
main:
	mov 	eax, msg1
	call 	print_string
	call 	read_int                ; eax <- n

	mov     ebx, eax                ; sauvegarde l'entier n dans ebx
	
	mov 	eax, msg2               ; debut de l'affichage du resultat
	call 	print_string
	
	push 	ebx                     ; n: parametre de la fonction somme
	call	somme                   ; resultat dans eax
	add	esp, 4                  ; depilement du parametre

	call	print_int               ; affichage de la somme
	call 	print_nl

fin:	mov	ebx, 0		        ; code de sortie, 0=normal
	mov	eax, 1			; num. de la commande exit
	int	0x80			; interruption 80 hex, appel au noyau
	

somme:			        	; parametre: n = [ebp+8]
				        ; resultat: somme 1+2+...+n dans eax
				        ; registres modifiés:eax, ebx
				        ; if (n=1) return 1; else return n+somme(n-1); 
	push 	ebp     
	mov 	ebp, esp

	mov 	ebx, [ebp+8]            ; ebx <- n
	cmp	ebx, 1                  ; au moins un des deux doit etre un registre
	je	stop                    ; si n = 1 aller vers stop

continue:                               ; sinon
        dec 	ebx                     ; n <- n-1
	push	ebx                     ; n-1: parametre de la fonction somme
	call	somme                   ; resultat dans eax
	add	esp, 4                  ; depilement du parametre

	add     eax, [ebp+8]            ; somme(n-1)+n
	
	jmp 	fin_somme               
	
stop:	mov	eax, 1                  ; s n=1, la somme vaut 1, resultat dans eax

fin_somme:
	pop 	ebp
	ret