Table des matières

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