.text main: move $s6, $ra # sauvegarde de $ra (dans $s6) li $v0, 5 # read_int syscall li $a0, 0 # ~(~0 << n) not $a0, $a0 sllv $a0, $a0, $v0 not $a0, $a0 li $a1, 0 li $a2, 0 jal t # on appelle t move $a0, $v0 # on affiche le résultat li $v0, 1 syscall li $v0, 4 la $a0, newline syscall move $ra, $s6 # restauration de $ra jr $ra ### la fonction récursive t t: addi $sp, $sp, -28 # allocation de 7 mots sur la pile sw $ra, 24($sp) # sauvegarde de $ra et $s0 ... $s5 sw $s0, 20($sp) sw $s1, 16($sp) sw $s2, 12($sp) sw $s3, 8($sp) sw $s4, 4($sp) sw $s5, 0($sp) li $s5, 1 # f = 1 beqz $a0, t_return # if (a) ... move $s0, $a0 move $s1, $a1 move $s2, $a2 move $s4, $s0 # e = a & ~b & ~c not $t0, $s1 and $s4, $s4, $t0 not $t0, $s2 and $s4, $s4, $t0 li $s5, 0 # f = 0 j test body: sub $a0, $s0, $s3 # f + = (a-d, add $a1, $s1, $s3 # (b+d)*2, sll $a1, $a1, 1 add $a2, $s2, $s3 # (c+d)/2) srl $a2, $a2, 1 jal t add $s5, $s5, $v0 sub $s4, $s4, $s3 # e -= d test: neg $t0, $s4 # d = e & -e and $s3, $s4, $t0 bnez $s3, body t_return: move $v0, $s5 # return f lw $ra, 24($sp) # restauration de $ra et $s0 ... $s5 lw $s0, 20($sp) lw $s1, 16($sp) lw $s2, 12($sp) lw $s3, 8($sp) lw $s4, 4($sp) lw $s5, 0($sp) addi $sp, $sp, 28 # désallocation de la trame de pile jr $ra ### zone de données .data newline:.asciiz "\n"