Td corrigé TD : les instructions - IBISC pdf

TD : les instructions - IBISC

TD : les instructions. 1. Les opérations du matériel. 1.1. Exercice. Quel est le code assembleur MIPS compilé pour l'expressions C ci-dessous ? f=(g+h)-(i+j);.




part of the document



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

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

oprsrtrddecvaladresse/fonct35198120001888032431981200

opRsrtrddecvaladresse/fonct8000100011100110100000000 0100 1011 0000800400000010010010000100000000100000800810101110011010000000 0100 1011 0000Exercice
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

80000019109024800043598100080008582188001201920190328001628000080020Un 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

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
donner le code
For (i=0; i=$203Beq $8,$0,Exit14Addi $17,$19,-15Tstfor2:Slti $8,$17,0# $8=1 si $17