Vous êtes sur la page 1sur 13

MARS

Mips Assembly and Runtime Simulator


Interface MARS

Boutons et vitesse d’exécution







Registre/
Edit/Execute Coproc 1/
Coproc 0





Message/ Run I/O
Registres
•  $zero : valeur nulle constante
•  $at : assembler temporaly réservé
•  $v0 et $v1 : retour des arguments de fonctions
•  $a0,…,$a3 : arguments des fonctions
•  $t0,…,$t9 : temporaires
•  $s0,…,$s9 : saved temporarly pour les appels de fonctions
•  $k0 et $k1 : kernel réservés
•  $gp : global area pointer
•  $sp : stuck pointer
•  $fp : frame pointer
•  $ra : return adress
•  pc : Program counter (ou IP : Instruction pointer) réservé
•  hi : partie supérieure
•  lo : partie inférieure
Premier programme
.data
monMessage: .asciiz "Mon premier message"

.text
li $v0,4
la $a0,monMessage
syscall

Exercice 1
•  Créer un nouveau fichier qui contiendra votre premier programme en langage
d’assemblage (File/new)
•  Editer le programme précédent dans l’onglet de la fenêtre Edit
•  Sauvegarder le programme dans un fichier (File/Save as ..)
•  Assembler (Run/Assemble) et voir le contenu de l’onglet Mars Messages
•  Exécuter le programme (Run/Go) et voir le contenu des onglets Mars
Messages et run I/O
•  Identifier la localisation des données (Data Segment) et du programme (Text
Segment)
•  Modifier la représentation des adresses et des valeurs (Hexadecimal Adresses,
Hexadecimal Values et ASCII)
•  Modifier la vitesse d’exécution du programme (Run speed 1 inst/sec)
•  Exécuter le programme étape par étape (Run/Step) et voir l’évolution des
contenus des registres utilisés
Interface MARS (Onglet Edit)
Interface MARS (Onglet Execute)
Addition
.data
nombre1: .word 15 # déclaration du premier terme entier
nombre2: .word 3 # déclaration du deuxième terme entier
message: .asciiz "Somme= " # déclaration du message
.text
lw $t0, nombre1 # t0 <-- (nombre 1)
lw $t1, nombre2 # t1 <-- (nombre 2)
add $t2, $t0, $t1 # t2 <-- (t0) + (t1)

li $v0,4 # afficher la message
la $a0,message
syscall
li $v0, 1 # afficher la somme
add $a0, $zero, $t2
syscall
Exercice 2
•  Localiser les valeurs des variables dans la section .data.
•  Modifier le programme pour afficher :
Nombe1 + nombre2 = somme
•  Exécuter le programme pour :
nombre1=2147483649 et nombre2=3
nombre1=2147483647 et nombre2=1
•  Modifier le programme pour effectuer le produit en utilisant :
uniquement l’addition.
la multiplication.
•  Exécuter le dernier programme en prenant :
nombre1=0x100000 et nombre2=0x1000

Exercice 3 : Qu’affiche ce
programme ?
.data
a: .word 3 # nombre
b: .word 5 # exposant
.text
lw $t0, a # charger a dans un registre
lw $t1, b # charger b dans un registre
li $t2, 1 # initialiser le résultat à 1

boucle : beq $t1, $zero, affiche # tant que t1 != 0
mul $t2, $t0, $t2 # multiplier le résultat par a
subi $t1, $t1, 1 # retrancher 1 de b
j boucle # se brancher à l'adresse boucle

affiche : li $v0,1 # imprimer le produit
add $a0, $zero, $t2
syscall
Exercice 4
•  Ecrire un programme en langage d’assemblage pour le calcul du
n! où n est un entier naturel.
n! = n x (n-1) x … 2 x 1

Formats d’instructions de Mips
3 types :

0 rs rt rd shamt funct R-type


6-bit 5-bit 5-bit 5-bit 5-bit 6-bit

opcode rs rt immediate I-type


6-bit 5-bit 5-bit 16-bit

opcode immediate J-type


6-bit 26-bit
Exemples de codage
R-type
Add $t2, $t0, $t1 # t2 ß (t0) + (t1)
0109502016 = 0000 0001 0000 1001 0101 0000 0010 00002
---rs--- ---rt--- ---rd---
I-type
li $v0, 4 # v0 ß 4
3c2402000416 = 0010 0100 0000 0010 0000 0000 0000 01002
---rs--- ---rt--- ---------immediate----------
J-type
J boucle # aller à l’adresse boucle
0810000516 = 0000 1000 0001 0000 0000 0000 0000 01012
---code-- ----------------immediate----------------

Vous aimerez peut-être aussi