Professional Documents
Culture Documents
IG3 2010-2011
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 ncessite
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'excuter les instructions les unes aprs les autres. Ce mode va nous intresser pour comprendre les
mcanismes de la programmation assembleur. Quel que soit l'environnement choisi, les gnralits de MIPS ncessaires au TD sont rappels ci-aprs.
Gnralits MIPS
Syntaxe
.ascii str Enregistre en mmoire la chane de caractres str, mais ne la termine pas par un
caractre nul.
.asciiz str Enregistre en mmoire la chane de caractres str et la termine par un caractre
nul.
Polytech' Montpellier
IG3 2010-2011
.data<@> Les lments qui suivent sont enregistrs dans le segment de donnes. Si l'argument
optionnel @ est prsent, les lments qui suivent sont enregistrs partir de l'adresse @.
.byte b1 , . . . ,bn Enregistre les n valeurs dans des octets conscutifs en mmoire.
.word w1 , . . . ,wn Enregistre les n quantits 32 bits dans des mots conscutifs en mmoire.
.float f1 , . . . ,fn Enregistre les n nombres ottants simples prcision dans des emplacements
mmoire conscutifs.
.text <@> Les lments qui suivent sont placs dans le segment de texte de l'utilisateur. Dans
SPIM, ces lments ne peuvent tre que des instructions ou des mots. Si l'argument optionnel @ est prsent, les lments qui suivent sont enregistrs partir de l'adresse @.
.globl sym Dclare que le symbole sym est global et que l'on peut y faire rfrence partir
d'autres chiers.
Les registres
Il existe 32 registres de 32 bits numrots $0, . . . , $31 ; les registres peuvent tre accd soit
par leur numro soit par leur nom.
Nom
$zero
$at
$v0,$v1
Numro
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
Rserv l'assembleur
valuation d'une expression et rsultats
d'une fonction
Arguments de sous-programmes
Valeurs temporaires (non prserves)
Valeurs temporaires (prserves)
Valeurs temporaires (non prserves)
Rserv pour les interruptions (i.e., systme
d'exploitation)
Pointeur global
Pointeur de pile
Pointeur de bloc
Adresse de retour
Par convention, lors de l'appel de procdure, les registres $t0,. . .,$t9 sont sauvegards par
l'appelant et peuvent donc tre utiliss sans problme par l'appel. Les registres $s0,. . .,$s7
doivent quand eux tre sauvegards et restitus 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 dplacements dans la pile se font sur des mots mmoire entiers (multiples de quatre
octets).
Lors du passage de passage de paramtres : tout paramtre plus petit que 32 bits est
automatiquement promu sur 32 bits.
Les quatre premiers paramtres sont passs par les registres $a0,. . .,$a3. Les paramtres
supplmentaires sont passs dans la pile.
Toute valeur de format infrieur ou gal 32 bits est retourne par le registre $v0 (sur 64
bits $v1 est utilis avec $v0).
Polytech' Montpellier
IG3 2010-2011
Gestion de la mmoire
Les simulateurs fournissent un ensemble de services par l'intermdiaire 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 systme qui retournent des valeurs placent leurs rsultats dans le registre
$v0 (ou $f0 pour les rsultats 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 prcision
$f12 = ottant double prcision
$a0 = chane de caractres
rsultat
.data
.asciiz
.text
li
la
syscall
li
li
syscall
$v0,1
$a0,5
Polytech' Montpellier
IG3 2010-2011
Questions
Question 1
Enregistrer dans un chier et excuter le code ci-dessus.
(a) A quelle adresse est charge le dbut de la chane de caractre str ?
(b) Quelle est la signication des instructions lui $1,4097 et ori $4,$1, 0, rajoutes par l'assembleur ?
(c) Rajouter une autre chane de caractre 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
Question 4
Considrer les tableaux T1 et T2 de taille 10 respectivement initialiss {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 excuter 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 excutes pendant l'excution de ce code ? Combien de rfrences
(lw, sw) des donnes en mmoire seront faites pendant l'excution ?
Question 5
crire un programme MIPS qui calcule le carr d'un nombre saisi au clavier l'aide d'un procdure
square dnie 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 dbut 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 inverss (e.g., 0D0C0B0A).
Polytech' Montpellier
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));
}
IG3 2010-2011