Licence Sciences et technologies Informatique/Informatique-Physique Architecture des ordinateurs Université de Provence Année 2007-2008 TD numéro 5 : Assembleur MIPS On rappelle les quelques instructions de l’assembleur MIPS suivantes : Instruction add $1, $2, $3 sub $1, $2, $3 addi $1, $2, val mul $1, $2, $3 div $1, $2, $3 rem $1, $2, $3 srl $1, $2, sa xor $1, $2, $3 ori $1, $2, val li $1, val move $1, $2 bne $1, $2, label beq $1, $2, label bgt $1, $2, label ble $1, $2, label j label jal label jr $ra Nom addition soustraction addition immédiate multiplication quotient reste décalage à droite de sa bits ou exclusif ou immédiat chargement immédiat copie de registres branchement si 6= branchement si = branchement si > branchement si ≤ saut appel de procédure retour de procédure Signification $1 ← $2 + $3 $1 ← $2 - $3 $1 ← $2 + val $1 ← $2 * $3 $1 ← $2 / $3 $1 ← $2 % $3 $1 ← $2/2sa $1 ← $2 xor $3 $1 ← $2 or val $1 ← val $1 ← $2 si ($1! = $2) alors aller à l’etiquette label si ($1 == $2) alors aller à l’etiquette label si ($1 > $2) alors aller à l’etiquette label si ($1 <= $2) alors aller à l’etiquette label aller à l’etiquette label aller à l’etiquette label et $ra ← P C + 4 P C ← $ra Exercice 1 Considérons le programme assembleur suivant : lw lw bne add j toto: add titi: $t0, $t1, $t0, $v0, titi $v0, 0($a0) 0($a1) $t1, toto $t0, $zero $t1, $zero Que fait le programme suivant ? Ecrire la fonction réalisée en C. Exercice 2 En supposant que $a0=0x1234 et que $a1=0x3 quel est la valeur de $t0 après l’exécutuon du programme suivant : toto: add $t0, $0, $0 add $t0, $t0, $a0 addi $a1, $a1, -1 bne $a1 , $zero, toto srl $t0, $t0, 4 Exercice 3 Ecrire un programme qui calcule la factorielle d’un nombre n. On suppose que n est initialement dans le registre $a0 et qu’à l’issue du programme, le résultat se trouve dans $a0. Exercice 4 Supposons un processeur MIPS big-endian qui exécute le programme suivant : a: b: c: xor $t0, $t0, $t0 addi $t1, $t0, 0x50 lw $t2,0($t1) beq $t2, $zero, c slt $t3, $t0, $t2 beq $t3, $zero, b lw $t0, 0($t1) addi $t1, $t1, 4 j a sw $t0, 0($t1) a) Expliquez quelle est la fonction du programme. b) Si l’état initial de la mémoire est celui ci-dessous, quel est l’état de la même portion de mémoire après l’exécution du programme ? Adresse 0x4E 0x04 0x4F 0xF C 0x50 0x01 0x51 0x23 0x52 0x45 0x53 0x00 0x54 0x00 0x55 0x00 0x56 0x11 0x57 0x34 0x58 0x00 0x59 0x00 0x5A 0x00 0x5B 0x00 0x5C 0xF C 0x5D 0xA0 Exercice 5 Ecrire un programme en assembleur MIPS qui réalise une multiplication russe, c’est à dire équivalent au programme C suivant : int multrusse(int a, int b) {int p = 0; while (b>0) { if (b%2 == 1) p = p + a; a = a * 2; b = b / 2; } return p; } 2