ASSEMBLEUR MIPS Exercice 1. Premier programme. test: div $t0

publicité
ASSEMBLEUR MIPS
1
2
3
4
5
6
7
8
9
10
11
Exercice 1. Premier programme.
test: div
$t0, $t1
mfhi
$t2
beq
$t2, $0, end
move
$t0, $t1
move
$t1, $t2
j
test
end: move
$a0, $t1
li
$v0, 1
syscall
li
$v0, 10
syscall
(1) On suppose que $t0 > $t1. Que fait ce programme ?
(2) Compléter le début du programme : demander deux nombres à l’utilisateur, et les ranger
dans l’ordre décroissant dans $t0 et $t1.
Exercice 2. Traduction.
Traduire les morceaux de code suivants en assembleur :
(1) if a mod 2 = 0 then
a := a / 2
else a := a - 1;
(2) somme := 0;
a := 1;
while a < 10 do
begin
somme := somme + a * a;
a := a + 1;
end
Exercice 3. Fibonacci.
On suppose que $t0 contient un nombre n entré par l’utilisateur. Écrire une suite d’instruction
qui calcule le n-ième nombre de Fibonacci, défini par
F0
=
1
F1
=
1
Fn+1
= Fn + Fn−1 pour n > 0.
Exercice 4. Entrée, sortie.
(1) Écrire un programme qui demande un entier à l’utilisateur, calcule le carré, renvoie le
résultat, et termine proprement.
(2) Traduire le code suivant en assembleur :
printf("Le joueur %i s’appelle %s\n", a, s);
où a est un entier et s un char*.
Liste partielle d’opérations MIPS
Les noms reg, resultat, arg1, arg2 désignent toujours des registres, valeur des entiers, adresse
des points d’accroche définis dans le programme ou bien des expressions du type “4($t3)”.
lw
sw
li
la
move
op
opi
mult
mfhi
mflo
div
reg, adresse
reg, adresse
reg, valeur
reg, adresse
reg, reg
résultat, arg1, arg2
résultat, arg1, valeur
arg1, arg2
reg
reg
arg1, arg2
j
jal
jr
beq
adresse
adresse
reg
arg1, arg2, adresse
syscall
si
si
si
si
$v0
$v0
$v0
$v0
=
=
=
=
1,
4,
5,
10,
charge la valeur pointée par l’adresse (4 octets)
sauvegarde le registre à l’adresse
met la valeur dans le registre
copie l’adresse elle-même, comme un pointeur
copie le registre de droite vers celui de gauche
où op ∈ {add, sub, and, or, xor}
où opi ∈ {addi, andi, ori, xori}
met le produit dans Hi et Lo
récupère la valeur de Hi
récupère la valeur de Lo
met le quotient dans Lo
et le reste dans Hi
saute à l’adresse
idem, enregistre l’adresse de retour dans $ra
saute à l’adresse contenue dans le registre
saute si arg1 = arg2 ;
même format pour {bne, bgt, bge, blt, ble},
respectivement {6=, >, ≥, <, ≤}.
effectue un appel système selon la valeur de $v0 :
affiche l’entier $a0,
affiche une chaı̂ne pointée par $a0,
lit un entier et le met dans $v0,
termine le programme.
Téléchargement