.data
    n:  .word   16          # Chargement du premier chiffre (17 retournera 0x00000000)
    res:    .word   0           # Chargement de la réponse
.text
    lui $t0,    0x1001          # Chargement de n et res dans la stack
    lw  $a0,    0($t0)          # Chargement de n dans $a0
    jal foo             # Appel de la procédure
    sw  $v0,    4($t0)          # On recupere la réponse dans la stack
    add $a0,    $0, $v0     # On charge la valeur dans le registre dadresse
    addi    $v0,    $0, 34      # On affiche en hexa décimal
    syscall                 # Appel système
    addi    $v0,    $0, 10      # sortie de programme
    syscall                 # Appel système
foo:
    bne $a0,    $0, fooNotZero  # if n != 0
    add $v0,    $0, $0      # on place 0 dans le résultat
    jr  $ra             # on retourne le résultat (caller)
fooNotZero:
    sw  $t0,    0($sp)          # sinon on stock $t0 dans la stack
    sw  $t1,    -4($sp)         # On stock $t1 dans la stack
    addi    $sp,    $sp,    -8      # On bouge le pointeur
    add $t0,    $0, $a0     # $t0 = $a0 = 17
fooBoucle:
    andi    $t1,    $a0,    1       # n & 1 
    bne $t1,    $0, fooFinBoucle    # ((n & 1) == 0) == 0)
    srl $a0,    $a0,    1       # n = n >> 1
    beq $0, $0, fooBoucle   # condition pour la boucle car toujours vrai
fooFinBoucle:
    srl $a0,    $a0,    1       # n = n >> 1
    beq $a0,    $0, fooNotZero2 # if n != 0
    add $v0,    $0, $0      # return 0
    beq $0, $0, fooFin      # fin procedure
fooNotZero2:
    add $v0,    $0, $t0     # return m
fooFin:
    addi    $sp,    $sp,    8       # On bouge le pointeur de pile
    lw  $t0,    0($sp)          # On enregistre les résultats
    lw  $t1,    -4($sp)         # On enregistre le second résultat
    jr  $ra             # retour de fonction (callee)