TD : les instructions
TD n°5 Décodage d'adresses. Problème 1: Le schéma ci-dessous représente
une carte conçue autour d'un microprocesseur CPU LPPL. Il comporte un bus ...
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 lappel 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 ladresse 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