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.

Toshiba MIPS 4400

Étudier et faire fonctionner les 2 exemples suivants

Question

Premier Exemple : Hello World

Voici par exemple un code permettant d'afficher « Hello World » :

1
.text 		#Ce qui suit est le texte d'un programme à assembler
2
	main:
3
       		li $v0, 4		# Charge 4 dans $v0 ce qui indique qu'il faudra afficher une chaîne
4
       		la $a0, salutation	# Met dans $a0 l'adresse de la salutation, drapeau repérant la donnée qui sera introduite ligne 14
5
       		syscall			# Exécute l'action codée dans $v0
6
       		li $v0, 10		# 10 code la terminaison du programme
7
       		syscall			# Exécute l'action codée dans $v0 : fin du programme
8
9
.data		# Les données du programme stockées dans la 1ère adresse disponible
10
11
salutation: .asciiz "Hello World"

Indice

  • la : Load Address : charge l'adresse de la requête

  • li : Load Immediate : charge la valeur

  • syscall : 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.

1
.text
2
	main:
3
		# Demande d'entrer un nombre
4
       		li $v0, 4
5
       		la $a0, lecture
6
       		syscall
7
		# Lit le nombre et le stocke dans $s0
8
		li $v0, 5		# Code 5 : lecture d'une donnée
9
       		syscall
10
		move $s0, $v0
11
		# Double le nombre
12
		# En fait add Rr, R1, R2 stocke dans le registre Rr la somme des contenus des registres R1 et R2
13
		add $s0, $s0, $s0
14
		# Affiche le texte d'introduction du résultat
15
		li $v0, 4
16
       		la $a0, affichage
17
       		syscall
18
		# Affiche le nombre obtenu
19
		li $v0, 1
20
       		move $a0, $s0
21
       		syscall
22
       		# Termine le programme
23
		li $v0, 10
24
       		syscall
25
26
.data
27
28
	lecture: .asciiz "Entre un nombre : \n"
29
	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 fonction add vu précédemment.