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