Tester et écrire du code assembleur
Chaque processeur a son langage assembleur. Un langage assez simple et bien documenté est celui des processeurs MIPS qui ont été principalement utilisés dans des systèmes embarqués (routeurs CISCO, consoles de jeux type Nintendo 64, Playstation 1 et 2, PSP...). Actuellement, ils sont fortement concurrencés par ARM.
Vous pouvez installer le simulateur MARS (https://computerscience.missouristate.edu/mars-mips-simulator.htm) si vous disposez d'une machine virtuelle Java.
Pour cette activité, nous utiliserons un assembleur en ligne : https://alanhogan.com/asu/assembler.php à exécuter sur cette page : https://alanhogan.com/asu/simulator.php.
Étudier et faire fonctionner les 2 exemples suivants
Question
Premier Exemple : Hello World
Voici par exemple un code permettant d'afficher « Hello World » :
.text #Ce qui suit est le texte d'un programme à assembler
main:
li $v0, 4 # Charge 4 dans $v0 ce qui indique qu'il faudra afficher une chaîne
la $a0, salutation # Met dans $a0 l'adresse de la salutation, drapeau repérant la donnée qui sera introduite ligne 14
syscall # Exécute l'action codée dans $v0
li $v0, 10 # 10 code la terminaison du programme
syscall # Exécute l'action codée dans $v0 : fin du programme
.data # Les données du programme stockées dans la 1ère adresse disponible
salutation: .asciiz "Hello World"
Indice
la
: Load Address : charge l'adresse de la requêteli
: Load Immediate : charge la valeursyscall
: appel du système d’exploitation
Indice
Sur MARS, on peut voir ce que contiennent les registres et la mémoire à chaque étape de l'exécution.
Sur la version en ligne, on récupère la sortie de l'assembleur et on la copie dans la seconde page web pour simuler l'exécution.
Question
Deuxième Exemple : Doublement d'un nombre
Voici un programme plus sophistiqué interactif : on demande un nombre et on fait afficher son double.
.text
main:
# Demande d'entrer un nombre
li $v0, 4
la $a0, lecture
syscall
# Lit le nombre et le stocke dans $s0
li $v0, 5 # Code 5 : lecture d'une donnée
syscall
move $s0, $v0
# Double le nombre
# En fait add Rr, R1, R2 stocke dans le registre Rr la somme des contenus des registres R1 et R2
add $s0, $s0, $s0
# Affiche le texte d'introduction du résultat
li $v0, 4
la $a0, affichage
syscall
# Affiche le nombre obtenu
li $v0, 1
move $a0, $s0
syscall
# Termine le programme
li $v0, 10
syscall
.data
lecture: .asciiz "Entre un nombre : \n"
affichage: .asciiz "\n Le double du nombre entrée est : "
Indice
Dans le simulateur, il faudra mettre le nombre à entrer dans le champ Input Data
.
Question
Proposer un code assembleur qui demande la saisie de 2 entiers et renvoie leur somme.
Indice
Il faudra donc demander 2 nombres et donc prévoir 2
lecture
On pourra utiliser
$t0
et$t1
comme registre pour ces 2 nombres et utiliser la fonctionadd
vu précédemment.