Architecture des ordinateurs TP Assembleur MIPS

Transcription

Architecture des ordinateurs TP Assembleur MIPS
Architecture des ordinateurs
TP Assembleur MIPS
Camille Kurtz, Ogier Maitre
Mars 2010
1
Documentations
–
–
–
–
–
2
Syscall : http://www.inf.pucrs.br/~eduardob/disciplinas/arqi/mips/syscall_codes.html
Fonctions : http://www.cs.pitt.edu/~xujie/cs447/Mips/sub.html
MIPS 3000 : ftp://asim.lip6.fr/pub/mips/
MIPS : http://cristal.inria.fr/~remy/poly/compil/1/
SPIM : http://pages.cs.wisc.edu/~larus/spim.html
Remarques préliminaires :
N le nom d’un fichier contenant un programme assembleur doit obligatoirement avoir le suffixe .s ;
N le corpus d’un fichier assembleur est toujours le suivant :
.data
#Datas...
variable: .asciiz "hello\n"
#...
.text
.globl main
#...
#...
j
Exit
# saut a la fin du programme
# variable pointe vers "hello\n\0"
main:
#corps du programme...
procedure:
#procedure...
#...
Exit:
# fin du programme
N on execute un programme assembleur MIPS en utilisant l’interprèteur SPIM de la manière suivante : spim
-file programme.s
3
Premier pas en assembleur MIPS
1. Commencez par réaliser votre premier programme assembleur "Hello World" affichant tout simplement la
chaîne de caractères "Hello World".
2. Réalisez un programme MIPS prenant en entrée deux nombres et réalisant leur addition.
3. Réalisez un programme assembleur faisant appel à une fonction "writeln" qui affiche à l’écran le contenu
d’un registre (exemple : a0) remplit par le programme principal. Le programme pricipal pourra appeler
plusieurs fois cette fonction pour afficher plusieurs données.
4
Exercices de programmation
1. Programme simple : Ecrire un programme assembleur MIPS affichant à l’écran les n premiers multiples
d’un nombre donné en paramètre.
#include <stdio.h>
if(b<=0) return 0;
//Calculer et afficher les b premiers multiples de a
//Exemple: a=4 b=5 -> 4 8 12 16 20
fin= b * a;
multiple = a;
int
{
int
int
int
main(void)
a, b;
multiple;
fin;
scanf("%d", &a);
scanf("%d", &b);
while(multiple <= fin) {
printf("%d\n", multiple);
multiple += a;
}
return 0;
}
2. Procédure + Pile : Ecrire un programme assembleur permettant d’appeler une procédure calculant la distance de Manhattan entre 2 points (dman = ∑ni=1 |xi − yi |) ; les coordonnés des deux points devront être passés
en paramètres par le biais de la pile. De même, les variables temporaires de la procédure devront être stockés
dans la pile.
3. Procédure + Pile : Traduire le programme C suivant en assembleur MIPS ; les paramètres, ainsi que les
variables de la procédure devront être stockés dans la pile. Exercice vu en TD.
#include <stdio.h>
}
int puissance(int n, int puiss) {
int i, temp= 1;
void main () {
int x, y;
scanf("%d", &x);
scanf("%d", &y);
printf("x^y = %d\n", puissance(x, y));
return;
}
for(i = 0; i< puiss; i++){
temp = temp * n;
}
return temp;
4. Procédure + Pile + Registres : En assembleur RISC on essaie au maximum d’utiliser les registres pour
passer les arguments. Convertissez le programme calculant la distance de Manhattan entre 2 points (cette
fois-ci en dimension variable n), en une version utilisant des pointeurs vers des “objets” points. La dimension
ainsi que ces pointeurs seront passés dans les registres. Les pointeurs pointeront vers les objets alloués sur
le tas.
5
Exercices de programmation avancée
1. Ecrivez un programme en MIPS testant si une String est un Palindrome ou non (Rappel http://fr.
wikipedia.org/wiki/Palindrome).
2. Ecrivez un programme assembleur calculant la factorielle d’un entier de manière itérative (une seule fonction principale contenant une boucle).
3. Ecrivez un programme assembleur calculant la factorielle d’un entier de manière récursive.