===== Code assembleur MIPS ===== ==== Exercice 1 ==== Traduire en assembleur MIPS l'extrait de code C suivant: if (t1 < t2) t3 = t1 ; else t3 = t2; la $t0,t1 lw $t1, $t0 blt $t2, $t1, joe b jim; joe: move $t3, $t1 b fin jim: move $t3, $t2 fin: nop ==== Exercice 2 ==== Soit l'extrait de code C suivant qui calcule dans t2 initialisé à 0 la somme des entiers de 1 à t1: while (t1 > 0 ) { t2 = T2 + t1; t1 = t1 - 1;} Traduire sous forme de pseudo-quadruplets: 0001 (t1, 0, <= , 0005) 0002 ( t2, t1, +, ) 0003 ( t1, 1, -, ) 0004 ( , , , 0001) 0005 Traduire le code obtenu en code assembleur MIPS: while: blez t1, suite add $t2, $t2, $t1 subi $t1, $t1, 1 b while suite: ==== Exercice 3 ==== Traduire en assembleur MIPS l'extrait de code C suivant (Fibonacci itératif): int u = 1, v = 1; int i, w; for (i=2; i <= n ; i++) { w = u; u = w + v; v = w; } printf("%d",u); Pour cela, nous envisageons l'enregistrement d'activation suivant, et puis l'exploitons: ^ SP -> | | | | | w | -12 | | | i | -8 | | | v | -4 | ^ FP-> | u | 0 | | | old FP | +4 | | | @ retour | +8 | | | n | +12 | li $fp 1 # u = 1; li -4($fp) 1 # v = 1 li -8($fp) 2 # i = 2 lw $t0 -8($fp) for: bgt $t0 12($fp), end # i cmp n lw $t0, ($fp) # load u en $t0 sw $t0 -12($fp) # save $t0 en w lw $t0 -12($fp) # load w en t$0 (pourquoi? la valeur y est déjà) lw $t1, -4($fp) # load v en $t1 add $t0, $t0, $t1 # place $t0 + $t1 en $t0 : w + v sw $t0, ($fp) # save $t1 en u lw $t0, -12($fp) # load w en $t0 sw $t0 -4($fp) # save $t0 (=w= en v lw $t0 -8($fp) # load i en $t0 addi $t0, $t0, 1 # increment $t0 de 1 sw $t0, -8($fp) # save la nouvelle valeur de i b for # end: li $v0, 1 # code pour un appel à print int la $a0 ($fp) # mise de la vaeleur de l'int syscall