.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"