ALMO TD n°1 - Assembleur MIPS32 : Instructions de base
Préambule
Ce TD permet de se familiariser avec le jeu d'instructions du processeur MIPS32
pour écrire des premiers programmes en assembleur. Pour en profiter pleinement, il est conseillé d'avoir lu auparavant le document Architecture externe MIPS, et il faut impérativement se référer au document Langage d'assemblage MIPS.
1. Étude d'une instruction simple
Les registres $6
et $7
du processeur (registres sources) contiennent des valeurs connues. On souhaite ranger dans le registre $8
(registre destination) le résultat de la somme des valeurs contenues dans les registres $6
et $7
.
- Quelle instruction faut-il utiliser ?
- Quels registres sont modifiés par l'exécution de cette instruction ?
- Quelle est la différence entre les instructions
add
etaddu
?
2. Chargement d'une valeur immédiate dans un registre
La plupart des instructions utilisent des valeurs contenues dans des registres comme opérandes pour les opérations arithmétiques et logiques.
- Écrire le code permettant de charger la valeur
0x1234
dans le registre$16
.
- Même question avec la valeur
0x12345678
à charger dans le registre$19
.
- Même question avec la valeur -3 à charger dans le registre
$22
3. Chargement dans un registre d'une valeur stockée en mémoire
Les données d'un programme sont en général des valeurs stockées dans la mémoire. Ainsi, tout traitement portant sur l'une de ces valeurs nécessite de charger cette valeur dans un registre.
- Écrire les directives assembleur permettant de réserver en mémoire 2 mots de 32 bits aux adresses
var1
etvar2
, et d'initialiser ces 2 mots avec les valeurs hexadécimales0x12
et0x34
.
- Écrire les instructions permettant de charger le contenu du mot d'adresse
var2
dans le registre$18
, l'adressevar2
étant placée dans le registre$8
.
4. Addition de deux valeurs stockées en mémoire
- Écrire un programme permettant de faire la somme entre deux nombres rangés en mémoire aux adresses
var1
etvar2
, et de ranger le résultat en mémoire à l'adressevar3
. La première instruction du programme (point d'entrée) doit avoir le labelmain
, et le programme doit se terminer par l'appel systèmeexit
.
5. Itération : Somme de 1 à 10
- Écrire, en utilisant une boucle, le programme assembleur qui stocke dans le registre
$5
la somme des nombres de 1 à 10, en utilisant trois registres. On utilisera l'appel système exit pour terminer le programme. Comment peut-on optimiser la boucle pour ne faire intervenir que deux registres ?