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.