TD 5 – MIPS : Fonctions et récursivité

Download Report

Transcript TD 5 – MIPS : Fonctions et récursivité

Université de Strasbourg
Licence d’informatique
Architecture des ordinateurs
Printemps 2014
TD 5 – MIPS : Fonctions et récursivité
Le but de ce TD est de comprendre le mécanisme des fonctions en MIPS. Ce mécanisme est illustré par un tri
de tableau d’entiers. Prenez des notes, le code écrit lors de ce TD sera réutilisé lors du prochain TP.
1
Parcours d’un tableau d’entiers
On considère le code MIPS suivant :
.data
RetChar: .asciiz "\n"
.text
.globl __start
__start:
li $s0 10 #nombre d’entiers dans $s0, registre temp. sauvegardé par les fonctions
move $a0 $s0
jal CreerTableau
move $s1 $v0 #$s1: adresse du premier octet du tableau
#Tri du tableau d’entiers:
#Fin Tri
#Affichage du tableau d’entiers:
#Fin affichage
j Exit
Exit:
ori $2, $0, 10
syscall
où la procédure CreerTableau crée un tableau d’entiers, et met des valeurs quelconques dans ce tableau. Le
nombre d’éléments du tableau (qui est passé à cette procédure par le registre $a0) est stocké dans le registre
$s0. À la sortie de cette procédure, $v0 contient l’adresse du premier octet en mémoire occupé par les éléments
de ce tableau. On considère dans toute la suite que les entiers sont stockés sur 4 octets. On suppose aussi que
les conventions concernant l’utilisation des registres sont respectées, et notamment que les registres $si sont
inchangés lors d’appels de procédures.
Exercice 1 – Écrire la portion de code MIPS située entre les lignes commentées #Affichage ...: et #Fin
... permettant d’afficher sur la sortie standard les éléments du tableau de taille contenue dans $s0 dont le
premier octet se trouve à l’adresse contenue dans $s1.
2
Pile et fonctions
La pile du processus permet de gérer le mécanisme des fonctions. En MIPS, la gestion de cette pile est entièrement confiée au “programmeur”. Elle commence à l’adresse 0x7FFFEFFC (par exemple) et grandit vers les
adresses décroissantes. Un des registres par convention dédié à la gestion de cette pile est : $sp plus petite
adresse dans la pile de la zone occupée par le contexte courant (plus petite occupée par la pile). Il incombe au
programmeur de renseigner/sauvegarder lui même les valeurs contenues dans ce registre.
Exercice 2 – En vous inspirant de la fonction MIPS AfficheEntier ci-dessous, décrire le mécanisme d’appel de fonction en MIPS et les conventions qui doivent être respectées lors de la programmation d’une fonction.
#################################Procédure AfficheEntier $a0: entier à afficher
AfficheEntier:
#prologue:
subu $sp $sp 8
1
sw $a0 4($sp)
sw $ra 0($sp)
#corps de la fonction
li $v0 1
syscall
#épilogue:
lw $a0 4($sp)
lw $ra 0($sp)
addu $sp $sp 8
jr $ra
#########################################################
On veut à présent trier le tableau par valeurs croissantes, avec le tri par insertion.
Exercice 3 – Écrire une fonction MIPS CherchePlace qui prend en entrée :
– un entier dans $a0,
– l’adresse d’un tableau d’entiers de taille $a0 dans $a1 (on suppose que ce tableau est trié),
– un entier dans $a2,
et qui retourne dans le registre $v0 la place (c’est à dire le décalage en octets depuis le début du tableau) que
l’entier dans le registre $a2 doit prendre dans le tableau pour que celui-ci soit trié.
Exercice 4 – Écrire une fonction MIPS Decalage qui prend en entrée :
– un entier dans $a0,
– l’adresse d’un tableau d’entiers de taille $a0 dans $a1,
et décale tous les éléments du tableau de 4 octets vers la droite (c’est à dire vers les adresses croissantes) dans
la mémoire (on supposera que les 4 octets de $a1 + 4($a0) à $a1 + 4($a0+1) peuvent être écrits).
Exercice 5 – Écrire une fonction MIPS Insere qui prend en entrée :
– un entier dans $a0,
– l’adresse d’un tableau d’entiers de taille $a0 dans $a1 (on suppose que ce tableau est trié),
– un entier dans $a2,
et qui insère dans le tableau commençant à $a1, de taille $a0, l’entier contenu dans $a2, (on supposera que
les 4 octets de $a1 + 4($a0) à $a1 + 4($a0+1) peuvent être écrits). Au retour de cette fonction, le tableau
commençant à $a1 de taille $a0+1 est trié.
Exercice 6 – Écrire une fonction MIPS Tri qui prend en entrée :
– un entier dans $a0,
– l’adresse d’un tableau d’entiers de taille $a0 dans $a1,
et qui trie ce tableau.
Enfin, appeler cette fonction dans le code MIPS de la section 1, entre les lignes commentées #Tri ... et #Fin
tri.
3
Tri récursif
Exercice 7 – Reprendre l’exercice 3 : écrire la fonction MIPS récursive CherchePlaceRec qui a les mêmes
spécifications que CherchePlace. Dérouler sur un petit exemple (tableau de taille 2 à l’adresse 0x10040000)
l’exécution de votre fonction. On supposera que l’adresse de l’instruction jal CherchePlaceRec appelant
pour la première fois votre fonction est 0x004000c4, et que chaque pseudo-instruction ou instruction de votre
fonction est codée sur 4 octets. Détailler notamment le contenu des registres $ra, $a0 et $a1.
Exercice 8 – Écrire une fonction MIPS TriRec récursive qui prend en entrée :
– un entier dans $a0,
– l’adresse d’un tableau d’entiers de taille $a0 dans $a1,
et qui trie ce tableau.
2