Université de la Méditerranée L3 Informatique - Compilation - TD6 ASSEMBLEUR MIPS 1 2 3 4 5 6 7 8 9 10 11 Exercice 1. Premier programme. test: div $t0, $t1 mfhi $t2 beq $t2, $0, end move $t0, $t1 move $t1, $t2 j test end: move $a0, $t1 li $v0, 1 syscall li $v0, 10 syscall (1) On suppose que $t0 > $t1. Que fait ce programme ? (2) Compléter le début du programme : demander deux nombres à l’utilisateur, et les ranger dans l’ordre décroissant dans $t0 et $t1. Exercice 2. Traduction. Traduire les morceaux de code suivants en assembleur : (1) if a mod 2 = 0 then a := a / 2 else a := a - 1; (2) somme := 0; a := 1; while a < 10 do begin somme := somme + a * a; a := a + 1; end Exercice 3. Fibonacci. On suppose que $t0 contient un nombre n entré par l’utilisateur. Écrire une suite d’instruction qui calcule le n-ième nombre de Fibonacci, défini par F0 = 1 F1 Fn+1 = = 1 Fn + Fn−1 pour n > 0. Exercice 4. Entrée, sortie. (1) Écrire un programme qui demande un entier à l’utilisateur, calcule le carré, renvoie le résultat, et termine proprement. (2) Traduire le code suivant en assembleur : printf("Le joueur %i s’appelle %s\n", a, s); où a est un entier et s un char*. 1 2 ASSEMBLEUR MIPS Liste partielle d’opérations MIPS Les noms reg, resultat, arg1, arg2 désignent toujours des registres, valeur des entiers, adresse des points d’accroche définis dans le programme ou bien des expressions du type “4($t3)”. lw sw li la move op opi mult mfhi mflo div reg, adresse reg, adresse reg, valeur reg, adresse reg, reg résultat, arg1, arg2 résultat, arg1, valeur arg1, arg2 reg reg arg1, arg2 j jal jr beq adresse adresse reg arg1, arg2, adresse syscall si si si si $v0 $v0 $v0 $v0 = = = = 1, 4, 5, 10, charge la valeur pointée par l’adresse (4 octets) sauvegarde le registre à l’adresse met la valeur dans le registre copie l’adresse elle-même, comme un pointeur copie le registre de droite vers celui de gauche où op ∈ {add, sub, and, or, xor} où opi ∈ {addi, andi, ori, xori} met le produit dans Hi et Lo récupère la valeur de Hi récupère la valeur de Lo met le quotient dans Lo et le reste dans Hi saute à l’adresse idem, enregistre l’adresse de retour dans $ra saute à l’adresse contenue dans le registre saute si arg1 = arg2 ; même format pour {bne, bgt, bge, blt, ble}, respectivement {6=, >, ≥, <, ≤}. effectue un appel système selon la valeur de $v0 : affiche l’entier $a0, affiche une chaı̂ne pointée par $a0, lit un entier et le met dans $v0, termine le programme.