TD : les instructions
TD : les instructions ... #Registre $9 contient i+j. sub $16,$8,$9 # f reçoit $8-$9,
ou (g+h)-(i+j) ..... sum=sum+I. printf (?the sum from 0 to 100 is %dn?, sum);.
Part of the document
TD : les instructions
Les opérations du matériel
1 Exercice Quel est le code assembleur MIPS compilé pour l'expressions C ci-dessous ? f=(g+h)-(i+j); Les variables f, g, h, i et j peuvent être assignées aux registres $16 à
$20.
(C'est au compilateur que revient cette tâche délicate.)
add $8,$17,$18 #Registre $8 contient g+h
add $9,$19,$20 #Registre $9 contient i+j
sub $16,$8,$9 # f reçoit $8-$9, ou (g+h)-(i+j)
Les opérandes du matériel
1 Exercice Quel est le code assembleur MIPS pour l'expression C ci-dessous ? T[i]=h+T[i] ; T est un tableau d'entiers
On suppose que les variables g et h sont dans $17 et $18,
$19 contienne la valeur i, et que le tableau débute à l'adresse Tstart
L'expression d'affectation C devient
muli $19,$19,4 #i=i*4
lw $8,Tstart($19) #reg temporaire $8 reçoit T[i]
add $8,$18,$8 #reg temporaire $8 reçoit h+T[i]
sw $8,Tstart($19) #on recopie h+T[i]dans T[i]
Des instructions pour prendre des décisions
1 Exercice Traduire en langage MIPS assembleur l'expression C suivante. if (i==j)
f=g+h;
else
f=g-h; si f,g,h,i et j correspondent aux registres $16 à $20
bne $19,$20,Else #aller en Else si i?j
add $16,$17,$18 #f=g+h (sauté si i?j)
j Exit #aller en Exit (jump)
Else: sub $16,$17,$18 #f=g-h (sauté si i=j)
Exit:
2 Exercice Traduire l'expression C suivante en langage assembleur MIPS. While (stock[i]==k)
i=i+j; si i, j et k correspondent aux registres $19 à $21, le tableau stock débute
à Sstart et le registre $10 contient la valeur 4.
loop : mult $9,$19,$10 #reg temporaire $9=i*4
lw $8,Sstart($9) #reg temporaire $8=stock[i]
bne $8,$21,Exit #aller en Exit si stock[i]?k
add $19,$19,$20 #i=i+j
j Loop #aller en Loop
Exit:
La représentation des instructions dans l'ordinateur
1 Exercice Quel est le code machine MIPS pour ces trois instructions ?
lw $8,Tstart($19) #reg temporaire $8 reçoit T[i]
add $8,$18,$8 #reg temporaire $8 reçoit h+T[i]
sw $8,Tstart($19) #on recopie h+T[i]dans T[i] Représentons les instructions avec les nombres décimaux. |op |rs |rt|rd |decval|adresse/fon|
| | | | | |ct |
|35 |19 |8 |1200 |
|0 |18 |8 |8 |0 |32 |
|43 |19 |8 |1200 |
| |op |Rs |rt |rd |decval|adresse/fonct |
|8000 |100011|10011 |010000|0000 0100 1011 0000 |
|8004 |000000|10010 |01000 |01000 |00000 |100000 |
|8008 |101011|10011 |01000 |0000 0100 1011 0000 |
2 Exercice Donner le code machine pour le code assembleur suivant
loop : mult $9,$19,$10 #reg temporaire $9=i*4
lw $8,Sstart($9) #reg temporaire $8=stock[i]
bne $8,$21,Exit #aller en Exit si stock[i]?k
add $19,$19,$20 #i=i+j
j Loop #aller en Loop
Exit: Les instructions assemblées et leurs adresses |80000 |0 |19 |10 |9 |0 |24 |
|80004 |35 |9 |8 |1000 |
|80008 |5 |8 |21 |8 | | |
|80012 |0 |19 |20 |19 |0 |32 |
|80016 |2 |80000 |
|80020 | | | | | | |
Un exemple complet Rappels
Pour traduire du C en assembleur :
- Allouer des registres aux variables du programme.
- Produire du code pour le corps de la procédure.
- Préserver les registres à travers l'appel de la procédure
Convention MIPS :
pour le passage de paramètres sont utilisés $4 à $7
1 Exercice Donner le code pour la procédure suivante
change(int v[], int k){
int temp;
temp = v[k];
v[k]=v[k+1];
v[k+1]=temp;
}
Les paramètres v et k sont alloués à $4 et $5,une variable temp en $15 et
$2 contient la base du tableau
NB : les adresses de mots contigus différent de 4 et non de 1
Le corps de la procédure modifie les registres $2, $15 et $16 addi $29,$29,-12 #on ajuste la tête de pile
sw $2,0($29) #range $2 au sommet
sw $15,4($29) #range $15 au sommet
sw $16,8($29) #range $16 au sommet
muli $2,$5,4 #reg $2=k*4
add $2,$4,$2 #reg $2=v+(k*4)
#reg $2 a l'adresse de v[k]
lw $15,0($2) #reg $15 (temp)=v[k]
lw $16,4($2) #reg $16=v[k+1] ; fait référence à
#l'élément suivant de v
sw $16,0($2) #v[k]=registre $16
sw $15,4($2) #v[k+1]=registre $15 (temp)
lw $2,0($29) #restitue $2 du sommet
lw $15,4($29) #restitue $15 du sommet
lw $16,8($29) #restitue $16 du sommet
addi $29,$29,12 # restitue la tête de pile
jr $31 # retour à la procédure appelante 2 donner le code For (i=0; i=$20 |
| |1: |$8,$19,$20 | |
|3 | |Beq | |
| | |$8,$0,Exit1 | |
|4 | |Addi | |
| | |$17,$19,-1 | |
|5 |Tstfor|Slti $8,$17,0|# $8=1 si $17