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
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:
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