TD 3 : Introduction au langage MIPS Environnement de travail

publicité
Polytech' Montpellier
ARCHITECTURE DES ORDINATEURS
IG3 2010-2011
TD 3 : Introduction au langage MIPS
Clément Jonquet
{[email protected]}
Environnement de travail
Nous allons utiliser un simulateur pour le langage MIPS. Étant donné la grande utilisation
de MIPS, plusieurs simulateurs sont disponibles (e.g., SPIM, MARS, MIPSter, etc.). Si vous
êtes sur votre machine personnelle vous pouvez utiliser SPIM ou MARS ; si vous êtes sur une
machine Polytech, il vous faut utiliser MARS, qui est une application Java et qui ne nécessite
pas d'installation.
SPIM (http://pages.cs.wisc.edu/~larus/spim.html) de James R. Larus (Microsoft,
Univ. of Wisconsin) ;
MARS (http://courses.missouristate.edu/KenVollmar/MARS/index.htm) de Ken Vollmar (Missouri State Univ.).
Les 2 environnements de programmation proposent un mode "step-by-step" qui permet d'exécuter les instructions les unes après les autres. Ce mode va nous intéresser pour comprendre les
mécanismes de la programmation assembleur. Quel que soit l'environnement choisi, les généralités de MIPS nécessaires au TD sont rappelés ci-après.
Généralités MIPS
Syntaxe
Les commentaires commencent par le symbole # et se terminent à la n de la ligne.
Un identicateur est une séquence de caractères alphanumériques, de soulignés (_) et de
points (.), qui ne commence pas par un chire.
Les codes opération d'instruction sont des mots réservés qui ne peuvent pas être utilisés
comme identicateurs.
Les étiquettes sont déclarées en les plaçant au début d'une ligne et en les faisant suivre du
symbole :.
Les nombres sont en base 10 par défaut. S'ils sont précédés de 0x ils sont interprétés comme
hexadécimaux.
Les chaînes de caractères sont encadrées par des doubles apostrophes ".
Certains caractères spéciaux dans les chaînes de caractères suivent la convention C :
retour-chariot : \n
tabulation : \t
guillemet : \"
Directives
.ascii str Enregistre en mémoire la chaîne de caractères str, mais ne la termine pas par un
caractère nul.
.asciiz str Enregistre en mémoire la chaîne de caractères str et la termine par un caractère
nul.
Polytech' Montpellier
ARCHITECTURE DES ORDINATEURS
IG3 2010-2011
.data<@> Les éléments qui suivent sont enregistrés dans le segment de données. Si l'argument
optionnel @ est présent, les éléments qui suivent sont enregistrés à partir de l'adresse @.
.byte b1 , . . . ,bn Enregistre les n valeurs dans des octets consécutifs en mémoire.
.word w1 , . . . ,wn Enregistre les n quantités 32 bits dans des mots consécutifs en mémoire.
.float f1 , . . . ,fn Enregistre les n nombres ottants simples précision dans des emplacements
mémoire consécutifs.
.text <@> Les éléments qui suivent sont placés dans le segment de texte de l'utilisateur. Dans
SPIM, ces éléments ne peuvent être que des instructions ou des mots. Si l'argument optionnel @ est présent, les éléments qui suivent sont enregistrés à partir de l'adresse @.
.globl sym Déclare que le symbole sym est global et que l'on peut y faire référence à partir
d'autres chiers.
Les registres
Il existe 32 registres de 32 bits numérotés $0, . . . , $31 ; les registres peuvent être accédé soit
par leur numéro soit par leur nom.
Nom
$zero
$at
$v0,$v1
Numéro
0
1
2-3
$a0,. . .,$a3
$t0,. . .,$t7
$s0,. . .,$s7
$t8,$t9
$k0,$k1
4-7
8-15
16-23
24-25
26-27
$gp
$sp
$fp
$ra
28
29
30
31
Description
Constante 0
Réservé à l'assembleur
Évaluation d'une expression et résultats
d'une fonction
Arguments de sous-programmes
Valeurs temporaires (non préservées)
Valeurs temporaires (préservées)
Valeurs temporaires (non préservées)
Réservé pour les interruptions (i.e., système
d'exploitation)
Pointeur global
Pointeur de pile
Pointeur de bloc
Adresse de retour
Appel de procédure - conventions
Par convention, lors de l'appel de procédure, les registres $t0,. . .,$t9 sont sauvegardés par
l'appelant et peuvent donc être utilisés sans problème par l'appelé. Les registres $s0,. . .,$s7
doivent quand à eux être sauvegardés et restitués exact par l'appelé.
La pile croit des adresses hautes vers les adresses basses : on soustrait à $sp pour allouer
de l'espace dans la pile, on ajoute à $sp pour rendre de l'espace dans la pile.
Les déplacements dans la pile se font sur des mots mémoire entiers (multiples de quatre
octets).
Lors du passage de passage de paramètres : tout paramètre plus petit que 32 bits est
automatiquement promu sur 32 bits.
Les quatre premiers paramètres sont passés par les registres $a0,. . .,$a3. Les paramètres
supplémentaires sont passés dans la pile.
Toute valeur de format inférieur ou égal à 32 bits est retournée par le registre $v0 (sur 64
bits $v1 est utilisé avec $v0).
2
Polytech' Montpellier
ARCHITECTURE DES ORDINATEURS
IG3 2010-2011
Gestion de la mémoire
Les appels système
Les simulateurs fournissent un ensemble de services par l'intermédiaire de l'instruction d'appel syscall. Pour demander un service on charge le code du service (voir tableau ci-dessous)
dans le registre $v0 et ses arguments dans les registres $a0,...,$a3 (ou $f12 pour les valeurs
ottantes). Les appels système qui retournent des valeurs placent leurs résultats dans le registre
$v0 (ou $f0 pour les résultats ottants).
service
print_int
print_oat
print_double
print_string
read_int
read_oat
read_double
read_string
sbrk
exit
code
1
2
3
4
5
6
7
8
9
10
arguments
$a0 = entier
$f12 = ottant simple précision
$f12 = ottant double précision
$a0 = chaîne de caractères
$a0 = tampon, $a1 = longueur
$a0 = quantité
résultat
un entier dans $v0
un ottant simple dans $v0
un ottant double dans $v0
une adresse dans $v0
Par exemple, le code suivant imprime la réponse = 5 .
str:
main:
.data
.asciiz
.text
li
la
syscall
li
li
syscall
"la réponse = "
$v0,4
$a0,str
#code appel système print_str
#adresse chaîne à imprimer
#on imprime la chaîne
#code appel système print_int
#entier à imprimer
#on l'imprime
$v0,1
$a0,5
3
Polytech' Montpellier
ARCHITECTURE DES ORDINATEURS
IG3 2010-2011
Questions
Question 1
Enregistrer dans un chier et exécuter le code ci-dessus.
(a) A quelle adresse est chargée le début de la chaîne de caractère str ?
(b) Quelle est la signication des instructions lui $1,4097 et ori $4,$1, 0, rajoutées par l'assembleur ?
(c) Rajouter une autre chaîne de caractère avant str dans le code. Que devient l'instruction ori ?
Question 2
Traduire en MIPS les aectations suivantes en continuant le programme ci-dessous :
.data
.asciiz ", "
.text
li
$t1,
li
$t2,
li
$t3,
add
$a0,
sub
$a0,
li
$v0,
syscall
li
$v0,
la
$a0,
syscall
(a) a0:= t1+4
(b) a0:= t1*8
(c) a0:= (t1+t2)/4+t3
sep:
10
50
15
$t1, $t2
$a0, $t3
1
4
sep
# a0:= t1+t2-t3
# a0=45
mod 2
(d) Comment éviter de répéter systématiquement le code d'achage ?
Question 3
Écrire le code ci-dessous en MIPS et exécuter le programme avec des valeurs e.g., i=2, j=2, g=7,
h=3
if (i=j) then
f := g+h;
else
f := g-h;
endif
print f
Question 4
Considérer les tableaux T1 et T2 de taille 10 respectivement initialisés à {1,2,3,4,5,6,7,8,9,10} et
{10,10,10,10,10,10,10,10,10,10}.
(a) Coder en MIPS la boucle suivante et exécuter la sur les tableaux T1 et T2.
c:=10
for i in 1..10 loop
T1[i] := T2[i] + c;
end loop;
(b) Combien y-a-t-il d'instructions exécutées pendant l'exécution de ce code ? Combien de références
(lw, sw) à des données en mémoire seront faites pendant l'exécution ?
Question 5
Écrire un programme MIPS qui calcule le carré d'un nombre saisi au clavier à l'aide d'un procédure
square dénie à une étiquette donné.
Question 6
Écrivez un programme MIPS inversant l'ordre des octets d'un mot de 4 octets O1 O2 O3 O4 (e.g.,
0A0B0C0D) chargé au début du programme dans le registre $a0. A la n du programme, le registre
$v0 doit contenir le mot O4 O3 O2 O1 où les octets sont inversés (e.g., 0D0C0B0A).
4
Polytech' Montpellier
ARCHITECTURE DES ORDINATEURS
Question 7
Écrire la fonction factorielle et le code suivant en MIPS.
main () {
printf ("The factorial of 10 is ", fact (10));
}
int fact (int n) {
if (n < 1)
return (1);
else
return (n * fact (n - 1));
}
5
IG3 2010-2011
Téléchargement