TD 12 : Programmation en langage machine MIPS

Transcription

TD 12 : Programmation en langage machine MIPS
TD 12 : Programmation en langage machine MIPS
L’objectif de ce TD est de comprendre comment mettre en œuvre un algorithme sur un
processeur.
Le processeur utilisé pour ce TD est le processeur MIPS, déjà présenté en cours et que vous
utiliserez en TP et concevrez dans le module CEP au second semestre.
Les registres et les bus du processeur MIPS considéré sont tous sur 32 bits et le registre R0
est cablé à zéro. On rappelle l’architecture globale du processeur et sa liaison avec la mémoire :
Le MIPS a un jeu d’instructions à 3 opérandes et ses instructions sont réparties dans 3 formats
différents :
31
2625
2120
1615
Format R : opcode
RS
RT
Format I : opcode
RS
RT
Format J : opcode
1110
RD
65
SH
IMM16
IMM26
0
FUNC
Dans ce TD, nous considérerons les instructions suivantes :
Nmémonic/
syntaxe
addiu $rt, $rs, imm
addu $rd, $rs, $rt
and $rd, $rs, $rt
andi $rt, $rs, imm
beq $rs, $rt, label
Format
I
R
R
I
I
Opcode/
Func
0x9
0x0/0x21
0x0/0x24
0xC
0x4
bne $rs, $rt, label
I
0x5
j label
lui $rt, imm
lw $rt, imm($rs)
J
I
I
0x2
0xF
0x23
or $rd, $rs, $rt
ori $rt, $rs, imm
slt $rd, $rs, $rt
slti $rt, $rs, imm
R
I
R
I
0x0/0x25
0xD
0x0/0x2A
0xA
sll $rd, $rt, sh
srl $rd, $rt, sh
subu $rd, $rs, $rt
sw $rt, imm($rs)
R
R
R
I
0x0/0x0
0x0/0x2
0x0/0x23
0x2B
1.
2.
3.
4.
Opération
R[rt]=R[rs]+SignExtImm 1
R[rd]=R[rs]+R[rt]
R[rd]=R[rs] & R[rt]
R[rt]=R[rs] & ZeroExtImm 2
if(R[rs]== R[rt])
PC=PC+4+BranchAddr 3
if(R[rs] != R[rt])
PC=PC+4+BranchAddr 3
PC = JumpAddr 4
R[rt] = IM M 16|016
R[rt] =
mem[R[rs]+SignExtImm 1 ]
R[rd] = R[rs] | R[rt]
R[rt] = R[rs] | ZeroExtImm 2
R[rd] = (R[rs] < R[rt]) ? 1 : 0
R[rt] =
(R[rs] < SignExtImm 1 ) ? 1 : 0
R[rd] = R[rt] « SH
R[rd] = R[rt] » SH
R[rd]=R[rs]-R[rt]
mem[R[rs]+SignExtImm 1 ]
= R[rt]
Nom
Complet
addition non signée avec un immédiat
addition non signée entre registres
ET bit à bit entre registres
ET bit à bit avec un immédiat
Branchement si égalité
Branchement si inégalité
Saut inconditionnel
Chargement immédiat haut
chargement registre
OU bit à bit registre à registre
OU bit à bit avec immédiat
Set Less Than registre à registre
Set Less Than avec immédiat
décalage à gauche
décalage logique à droite
soustraction non signée entre registres
stockage registre
SignExtImm = IM M 1616
15 |IM M 16
ZeroExtImm = 016 |IM M 16
2
BranchAddr = IM M 1616
15 |IM M 16|0
JumpAddr = (P C + 4)31···28 |IM M 26|02
Préparation
Ex. 1 : Interprétation d’instructions
Question 1 Traduire en langage machine les instructions MIPS suivantes :
andi $5, $24, 0xFF
subu $16, $8, $4
Interpréter les mots de 32 bits suivant comme des instructions MIPS :
0x8CE3000C
0x000FF9C0
Ex. 2 : Implantations basiques
Question 1
Comment peut on charger un immédiat de 32 bits dans un registre utilisateur ?
Question 2
suivante :
En supposant que A est dans le registre R1, traduisez la structure conditionnelle
while A /= 0 loop
A:= A -1;
end loop;
Question 3 Donnez les valeurs des champs IMM des instructions de branchement utilisées en
supposant que votre programme commence à l’adresse 0x80.
Question 4 En supposant que A et B sont des variables 32 bits non signées situées dans la
mémoire aux adresses 0x1000 et 0x1004, traduisez la structure conditionnelle suivante :
if A < B then
A := 1023;
else
A := 511;
end if;
Ex. 3 : Implantation du PGCD en assembleur MIPS
Question 1 En supposant que A0 et B0 sont des valeurs 32 bits non signées qui ont été situées
dans la mémoire aux adresses 0x1000 et 0x1004, traduisez l’algorithme PGCD ci-dessous. Le
résultat sera mis à l’adresse 0x1008.
procedure PGCD is
A, B: Positive;
begin
Get(A); -- A :=A0
Get(B); -- B :=B0
while A /= B loop
if A < B then
B := B - A;
else
A := A - B;
end if;
end loop;
Put(B);
end;
Pour aller plus loin...
Question 2 Transcrire le programme ci-dessus en langage machine en hexadé-
cimal.
Pour aller plus loin...
Ex. 4 : Comparaison processeur/circuit dédié
Question 1 Comparer le nombre de cycle nécessaire à l’implantation processeur pour exécuter
cet algorithme pgcd à celui de l’implantation du TD8 en supposant que le processeur met 3 cycles
pour exécuter une instruction.
A votre avis, lequel de ces 2 circuits nécessitent le plus de ressources ?
Quel avantage a le processeur sur le circuit dédié ?