.text
	.globl	main

## int isqrt(int n) {
##   int c = 0, s = 1;
##   while (s <= n) {
##     c++;
##     s += 2*c + 1;
##   }
##   return c;
## }

isqrt:
        xorq    %rax, %rax      # c dans %rax (car return c à la fin)
        movq    $1, %rcx        # s dans %rcx (caller-save)
        jmp     T1
L1:     incq    %rax
        leaq    1(%rcx, %rax, 2), %rcx
T1:     cmpq    %rdi, %rcx      # s <= n ?
        jle     L1
        ret

## int main() {
##   int n;
##   for (n = 0; n <= 20; n++)
##     printf("sqrt(%2d) = %2d\n", n, isqrt(n));
##   return 0;
## }

main:
        pushq   %rbx            # sauvegarde %rbx et aligne la pile
        movq    $0, %rbx        # n dans %rbx (callee-save)
L2:     movq    %rbx, %rdi
        call    isqrt
        movq	$format, %rdi   # premier argument (format)
        movq    %rbx, %rsi      # deuxième argument (n)
        movq    %rax, %rdx      # troisième argument (isqrt(n))
        xorq    %rax, %rax      # %rax = 0 = pas de registres vecteurs
	call	printf
        incq    %rbx            # n++
        cmpq    $20, %rbx       # n <= 20 ?
        jle     L2
        xorq    %rax, %rax      # sortie avec code 0
        popq    %rbx
	ret

        .data
format:
	.string	"sqrt(%2d) = %2d\n"