Vous êtes sur la page 1sur 32

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Processeur MIPS R3000 Langage d'assemblage

Version 2.2 (septembre 2004)

JeanLou Desbarbieux Franois Dromard Alain Greiner Frdric Ptrot Franck Wajsburt

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

1/

INTRODUCTION

Ce document dcrit le langage d'assemblage du processeur MIPS R3000, ainsi que diffrentes conventions relatives l'criture des programmes en langage d'assemblage. Un document spar dcrit l'architecture externe du processeur, c'est--dire les registres visibles du logiciel, les rgles d'adressage de la mmoire, le codage des instructions machine, et les mcanismes de traitement des interruptions et des exceptions. On prsente ici successivement l'organisation de la mmoire, les principales rgles syntaxiques du langage, les instructions et les macro-instructions, les directives acceptes par l'assembleur, les quelques appels systme disponibles, ainsi que les conventions imposes pour les appels de fonctions et la gestion de la pile. Les programmes assembleur source qui respectent les rgles dfinies dans le prsent document peuvent tre assembls par l'assembleur MIPS de l'environnement GNU pour gnrer du code excutable. Ils sont galement accepts par le simulateur du MIPS R3000 utilis en TP qui permet de visualiser le comportement du processeur instruction par instruction.

2/

ORGANISATION DE LA MEMOIRE

Rappelons que le but d'un programme source X crit en langage d'assemblage est de fournir un programme particulier (appel assembleur) les directives ncessaires pour gnrer le code binaire reprsentant les instructions et les donnes qui devront tre charges en mmoire pour permettre au programme X dtre excut par le processeur. Dans l'architecture MIPS R3000, l'espace adressable est divis en deux segments : le segment utilisateur, et le segment noyau. Un programme utilisateur utilise gnralement trois sous-segments (appels sections) dans le segment utilisateur: la section text contient le code excutable en mode utilisateur. Elle est implante conventionnellement l'adresse 0x00400000. Sa taille est fixe et calcule lors de l'assemblage. La principale tche de l'assembleur consiste gnrer le code binaire correspondant au programme source dcrit en langage d'assemblage, qui sera charg en mmoire dans cette section. la section data contient les donnes globales manipules par le programme utilisateur. Elle est implante conventionnellement l'adresse 0x10000000. Sa taille est fixe et calcule lors de l'assemblage. Les valeurs contenues dans cette section peuvent tre initialises grce des directives contenues dans le programme source en langage d'assemblage.

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

la section stack contient la pile d'excution du programme utilisateur. Sa taille varie au cours de l'excution. Elle est implante conventionnellement l'adresse 0x7FFFF000. La pile s'tend vers les adresses dcroissantes. Trois sections sont galement dfinies dans le segment noyau (kernel):

la section ktext contient le code excutable en mode noyau. Elle est implante conventionnellement l'adresse 0x80000000. Sa taille est fixe et calcule lors de l'assemblage. la section kdata contient les donnes globales manipules par le systme d'exploitation en mode noyau. Elle est implante conventionnellement l'adresse 0xC0000000. Sa taille est fixe et calcule lors de l'assemblage. la section kstack contient la pile d'excution du noyau. Sa taille varie au cours de l'excution. Elle est implante conventionnellement l'adresse 0xFFFFF000. Cette pile s'tend vers les adresses dcroissantes.

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

0xFFFFFFFF Reserved 0xFFFFF000 0xFFFFEFFF .kstack

Segment noyau .kdata 0xC0000000 0xBFFFFFFF .ktext 0x80000000 0x7FFFFFFF Reserved 0x7FFFF000 0x7FFFEFFF .stack Segment utilisateur

.data 0x10000000 0x0FFFFFFF .text

0x00400000 0x003FFFFF Reserved 0x00000000

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

3/

RGLES SYNTAXIQUE

On dfinit ci-dessous les principales rgles dcriture dun programme source.

3.1) les noms de fichiers


Les noms des fichiers contenant un programme source en langage d'assemblage doivent tre suffix par .s. Exemple: monprogramme.s

3.2) les commentaires


ils commencent par un # et s'achvent la fin de la ligne courante. Exemple : ############################################### # Source Assembleur MIPS de la fonction memcpy ############################################### lw $10, 0($11) # sauve la valeur copie dans la mmoire

3.3) les entiers


Une valeur entire dcimale est note 250 (sans prfixe), et une valeur entire hexadcimale est note 0xFA (prfixe par zro suivi de x). En hexadcimal, les lettres de A F peuvent tre crites en majuscule ou en minuscule.

3.4) les chanes de caractres


Elles sont simplement entre guillemets, et peuvent contenir les caractres d'chappement du langage C. Exemple : "Oh la jolie chane avec retour la ligne\n".

3.5) les labels


Ce sont des mnmoniques correspondant des adresses en mmoire. Ces adresses peuvent tre soit des adresses de variables stockes en mmoire (principalement dans la section data), soit des adresses de sauts (principalement dans la section text). Ce sont des chanes de caractres qui doivent commencer par une lettre, un caractre _, ou un caractre .. Lors de la dclaration, ils doivent tre suffixs par le caractre :. Pour y rfrer, on supprime le :. Exemple : .data message: .asciiz "Ceci est une chane de caractres...\n" .text __start: lui $4, message >> 16 ori $4, $4, message & 0xFFFF # adresse de la chane dans $4 ori $2, $0, 4 # code de lappel systme dans $2 5

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE syscall

LICENCE INFORMATIQUE

Attention: sont illgaux les labels qui ont le mme nom qu'un mnmonique de l'assembleur.

3.6) les immdiats


On appelle immdiat un oprande contenu dans l'instruction. Ce sont des constantes. Ce sont soit des entiers, soit des labels. Les valeurs de ces constantes doivent respecter une taille maximum qui est fonction de l'instruction qui les utilise: 16 ou 26 bits.

3.7) les registres


Le processeur MIPS possde 32 registres de travail accessibles au programmeur. Chaque registre est connu par son numro, qui varie entre 0 et 31, et est prfix par un $. Par exemple, le registre 31 sera not $31 dans l'assembleur. En dehors du registre $0 qui contient toujours la valeur 0, tous les registres sont identiques du point de vue de la machine. Afin de normaliser et de simplifier l'criture du logiciel, des conventions d'utilisation des registres sont dfinies. Ces conventions sont particulirement ncessaires lors des appels de fonctions. $0 $1 $2 $3 $4,$5,$6,$7 $8,,$26 $27,$28 $29 $30 $31 Vaut 0 en lecture. Non modifi par une criture Rserv lassembleur pour les macros. Ne doit pas tre utilis Utilis pour les valeurs de retour des fonctions Utilis pour les appels systmes. Utiliss par le compilateur pour optimiser les appels de fonctions Registres de travail utilisable par le code utilisateur Rservs aux procdures noyau. Pointeur de pile Pointeur sur la zone des variables globales (section data) Contient ladresse de retour dune fonction

3.8) les arguments


La plupart des instructions ncessitent un ou plusieurs arguments. Si une instruction ncessite plusieurs arguments, ces arguments sont spars par des virgules. Dans une instruction assembleur, on aura en gnral comme premier argument le registre dans lequel est mis le rsultat de l'opration, puis ensuite le premier registre source, puis enfin le second registre source ou une constante. Exemple: add $3, $2, $1

3.9) l'adressage mmoire


Le MIPS ne possde qu'un unique mode d'adressage pour lire ou crire des donnes en mmoire: l'adressage indirect registre avec dplacement. Ladresse est obtenue en additionnant le dplacement (positif ou ngatif) au contenu du registre.

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE Exemples: lw Sw $12, $20, 13($10) -60($22)

LICENCE INFORMATIQUE # $12 <= Mem[$10 + 13] # Mem[$22 60] <= $20

Sil ny a pas dentier devant la parenthse ouvrante, le dplacement est nul. Pour ce qui concerne les sauts, il nest pas possible dcrire des sauts des adresses constantes, comme par exemple un j 0x400000 ou bnez $3, -12. Il faut ncessairement utiliser des labels.

4/

INSTRUCTIONS

Dans ce qui suit, le registre not $rr est le registre destination, c.--d. qui reoit le rsultat de lopration, les registres nots $ri et $rj sont les registres source qui contiennent les valeurs des oprandes sur lesquelles seffectue lopration. Notons quun registre source peut tre le registre destination dune mme instruction assembleur. Un oprande immdiat sera not imm, et sa taille sera spcifie dans la description : de linstruction. Les instructions de saut prennent comme argument une tiquette (ou label), qui est utilise pour calculer ladresse de saut. Toutes les instructions modifient le registre PC (program counter), qui contient ladresse de linstruction suivante excuter. Enfin, le rsultat dune multiplication ou dune division est rang dans deux registres spciaux, HI pour les poids forts, et LO pour les poids faibles. Ceci nous amne introduire quelques notations: + x / mod and or nor xor Mem[ad] <= || Bn X pq Addition entire en complment 2 Soustraction entire en complment 2 Multiplication entire en complment 2 Division entire en complment 2 Reste de la division entire en complment 2 Oprateur et logique bit bit Oprateur ou logique bit bit Oprateur non-ou logique bit bit Oprateur ou-exclusif logique bit bit Contenu de la mmoire ladresse ad Assignation Concatnation entre deux chanes de bits Rplication du bit B n fois dans une chane de bits Slection des bits p q dans une chane de bits X

Dans la description des instructions, pc reprsente l'adresse de l'instruction considre.

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

add Addition registre registre signe Syntaxe: add $rr, $ri, $rj

Description : Les contenus des registres $ri et $rj sont ajouts pour former un rsultat sur 32 bits qui est plac dans le registre $rr rr <= ri + rj Exception: gnration d'une exception si dpassement de capacit.

addi
Addition registre immdiat signe Syntaxe : addi $rr, $ri, imm Description : La valeur immdiate sur 16 bits subit une extension de signe, et est ajoute au contenu du registre $ri pour former un rsultat sur 32 bits qui est plac dans le registre $rr. rr <= (imm1516 || imm 150 ) + ri Exception: gnration d'une exception si dpassement de capacit.

addiu
Addition registre immdiat non-signe Syntaxe : addiu $rr, $ri, imm Description: La valeur immdiate sur 16 bits subit une extension de signe, et est ajoute au contenu du registre $ri pour former un rsultat sur 32 bits qui est plac dans le registre $rr. rr <= ( imm1516 || imm 150 ) + ri Exception: pas dexception

addu
Addition registre registre non-signe Syntaxe : addu $rr, $ri, $rj Description : Les contenus des registres $ri et $rj sont ajouts pour former un rsultat sur 32 bits qui est plac dans le registre $rr rr <= ri + rj Exception: pas dexception

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

and
Et bit--bit registre registre Syntaxe : and $rr, $ri, $rj Description : Un et bit--bit est effectu entre les contenus des registres $ri et $rj. Le rsultat est plac dans le registre $rr. rr <= ri and rj Exception: pas dexception

andi
Et bit--bit registre immdiat Syntaxe : andi $rr, $ri, imm Description : La valeur immdiate sur 16 bits subit une extension de zros. Un et bit--bit est effectu entre cette valeur tendue et le contenu du registre $ri pour former un rsultat plac dans le registre $rr. rr <= (016 || imm 150) and ri Exception: pas dexception

beq
Branchement si registre gal registre Syntaxe : beq $ri, $rj, label Description : Les contenus des registres $ri et $rj sont compars. S'ils sont gaux, le programme saute l'adresse associe l'tiquette par l'assembleur. if (ri = rj) pc <= adresse associe label Exception: pas dexception

bgez
Branchement si registre suprieur ou gal zro Syntaxe : bgez $ri, label Description : Si le contenu du registre $ri est suprieur ou gal zro, le programme saute l'adresse associe l'tiquette par l'assembleur. if (ri >= 0) pc <= adresse associe label Exception: pas dexception

bgezal
Branchement une fonction si registre suprieur ou gal zro Syntaxe : bgezal $ri, label LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 9

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Description : Inconditionnellement, l'adresse de l'instruction suivant linstruction bgezal est stocke dans le registre $31. Si le contenu du registre $ri est suprieur ou gal zro, le programme saute l'adresse associe l'tiquette par l'assembleur. r31 <= pc + 4 if (ri >= 0) pc <= adresse associe label Exception: pas dexception

bgtz
Branchement si registre strictement suprieur zro Syntaxe : bgtz $ri, label Description : Si le contenu du registre $ri est strictement suprieur zro, le programme saute l'adresse associe l'tiquette par l'assembleur. if (ri > 0) pc <= adresse associe label Exception: pas dexception

blez
Branchement si registre infrieur ou gal zro Syntaxe : blez $ri, label Description : Si le contenu du registre $ri est infrieur ou gal zro, le programme saute l'adresse associe l'tiquette par l'assembleur. if (ri <= 0) pc <= adresse associe label Exception: pas dexception

bltz
Branchement si registre strictement infrieur zro Syntaxe : bltz $ri, label Description : Si le contenu du registre $ri est strictement infrieur zro, le programme saute l'adresse associe l'tiquette par l'assembleur. if (ri < 0) pc <= adresse associe label Exception: pas dexception

bltzal
Branchement une fonction si registre strictement infrieur zro Syntaxe : bltzal $ri, label

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

10

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Description : Inconditionnellement, l'adresse de l'instruction suivant linstruction bgezal est sauve dans le registre $31. Si le contenu du registre $ri est strictement infrieur zro, le programme saute l'adresse associe l'tiquette par l'assembleur. r31 <= pc + 4 if (ri < 0) pc <= adresse associe label Exception: pas dexception

bne
Branchement si registre diffrent de registre Syntaxe : bne $ri, $rj, label Description: Les contenus des registres $ri et $rj sont compars. S'ils sont diffrents, le programme saute l'adresse associe l'tiquette par l'assembleur. If (ri not= rj ) pc <= adresse associe label Exception: pas dexception

break
Arrt et saut la routine d'exception Syntaxe : break imm Description : Un point d'arrt est dtect, et le programme saute l'adresse de la routine de gestion des exceptions. Pc <= 0x80000080 Exception: dclenchement dune exception de type point darrt.

div
Division entire signe Syntaxe : div $ri, $rj Description : Le contenu du registre $ri est divis par le contenu du registre $rj, le contenu des deux registres tant considr comme des nombres en complment deux. Le quotient de la division est plac dans le registre spcial lo, et le reste dans dans le registre spcial hi. lo <= ri / rj hi <= ri mod rj Exception: pas dexception

divu
Division entire non-signe

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

11

UNIVERSITE PIERRE ET MARIE CURIE Syntaxe : divu $ri, $rj

LICENCE INFORMATIQUE

Description : Le contenu du registre $ri est divis par le contenu du registre $rj, le contenu des deux registres tant considr comme des nombres non signs. Le quotient de la division est plac dans le registre spcial lo, et le reste dans le registre spcial hi. lo <= ri / rj hi <= ri mod rj Exception: pas dexception

j
Saut inconditionnel immdiat Syntaxe : j label Description : Le programme saute inconditionnellement l'adresse associe l'tiquette par l'assembleur. pc <= adresse associe label Exception: pas dexception

jal
Appel de fonction inconditionnel immdiat Syntaxe : jal label Description : L'adresse de l'instruction suivant linstruction jal est stocke dans le registre $31. Le programme saute inconditionnellement l'adresse associe l'tiquette par l'assembleur. r31 <= pc + 4 pc <= adresse associe label Exception: pas dexception

jalr
Appel de fonction inconditionnel registre Syntaxe : jalr $ri ou jalr $rr, $ri Description : Le programme saute l'adresse contenue dans le registre $ri. L'adresse de l'instruction suivant linstruction jalr est sauve dans le registre $rr. Si le registre n'est pas spcifi, alors c'est par dfaut le registre $31 qui est utilis. rr <= pc + 4 pc <= ri Exception: pas dexception

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

12

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

jr
Branchement inconditionnel registre Syntaxe : jr $ri Description: Le programme saute l'adresse contenue dans le registre $ri. pc <= ri Exception: pas dexception

lb
Lecture d'un octet sign en mmoire Syntaxe : lb $rr, imm($ri) Description : L'adresse de lecture est la somme de la valeur immdiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. Loctet lu cette adresse subit une extension de signe et est plac dans le registre $rr. rr <= (Mem[imm + ri])724 || (Mem[imm + ri])70 Exceptions: - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini

lbu
Lecture d'un octet non-sign en mmoire Syntaxe : lbu $rr, imm($ri) Description : L'adresse de lecture est la somme de la valeur immdiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. Loctet lu cette adresse subit une extension avec des zros et est plac dans le registre $rr. rr <= 024 || (Mem[imm + ri])70 Exceptions: - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini.

lh
Lecture d'un demi-mot sign en mmoire Syntaxe : lh $rr, imm($ri) Description : L'adresse de lecture est la somme de la valeur immdiate sur 16bits, avec extension de signe, et du contenu du registre $ri. Le bit de poids faible de cette adresse doit tre zro (adresse multiple de 2).

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

13

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Le demi-mot de 16 bits lu cette adresse subit une extension de signe et est plac dans le registre $rr. rr <= (Mem[imm + ri])1516 || (Mem[imm + ri])150 Exceptions: - Adresse non aligne sur une frontire de demi-mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini.

lhu
Lecture d'un demi-mot non-sign en mmoire Syntaxe : lhu $rr, imm($ri) Description : L'adresse de lecture est la somme de la valeur immdiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. Le bit de poids faible de cette adresse doit tre zro (adresse multiple de 2). Le demi-mot de 16 bits lu cette adresse subit une extension avec des zro et est plac dans le registre $rr. rr <= 016 || (Mem[imm + ri])150 Exceptions: - Adresse non aligne sur une frontire de demi-mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini

lui
Chargement dune constante dans les poids forts dun registre Syntaxe : lui $rr, imm Description : La constante immdiate de 16 bits est dcale de 16 bits gauche, et est complte de zro droite. La valeur sur 32 bits ainsi obtenue est place dans le registre $rr. rr <= imm 150 || 016 Exception: pas dexception

lw
Lecture d'un mot de la mmoire Syntaxe : lw $rr, imm($ri) Description : L'adresse de lecture est la somme de la valeur immdiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. Les deux bits de poids faible de cette adresse doivent tre zro (adresse multiple de 4). Le mot de 32 bits lu cette adresse est plac dans le registre $rr. rr <= Mem[imm + ri] Exceptions: - Adresse non aligne sur une frontire de mot. LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 14

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

- Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini

mfc0
Copie d'un registre spcial dans d'un registre gnral Syntaxe : mfc0 $rt, $rd Description : Le contenu du registre spcial $rd --- non directement accessible au programmeur --- est recopi dans le registre gnral $rt. Les registres spciaux servent la gestion des exceptions et interruptions, et sont les suivants : $8 pour BAR (bad address register), $12 pour SR (status register), $13 pour CR (cause register) $14 pour EPC (exception program counter) rt <= rd Exception: registre spcial non dfini.

mfhi
Copie le registre hi dans un registre gnral Syntaxe : mfhi $rr Description : Le contenu du registre hi --- qui est mis jour par les oprations de multiplication ou de division --- est recopi dans le registre gnral $rr. rr <= hi Exception: pas dexception

mflo
Copie le registre lo dans un registre gnral Syntaxe : mflo $rr Description: Le contenu du registre lo --- qui est mis jour par les oprations de multiplication ou de division --- est recopi dans le registre gnral $rr. rr <= lo Exception: pas dexception.

mtc0
Copie d'un registre gnral dans un registre spcial Syntaxe : mtc0 $rt, $rd

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

15

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Description: Le contenu du registre gnral $rt est recopi dans le registre spcial $rd --- non directement accessible au programmeur --Les registres spciaux servent la gestion des exceptions et interruptions, et sont les suivants : $8 pour BAR (bad address register), $12 pour SR (status register), $13 pour CR (cause register) $14 pour EPC (exception program counter) rt <= rd Exception: registre spcial non dfini.

mthi
Copie d'un registre gnral dans le registre hi Syntaxe : mthi $ri Description : Le contenu du registre gnral $ri est recopi dans le registre hi. Exception: pas dexception.

mtlo
Copie d'un registre gnral dans le registre lo Syntaxe : mtlo $ri Description : Le contenu du registre gnral $ri est recopi dans le registre lo. Exception: pas dexception.

mult
Multiplication signe Syntaxe : mult $ri, $rj Description : Le contenu du registre $ri est multipli par le contenu du registre $rj, le contenu des deux registres tant considr comme des nombres en complment deux. Les 32 bits de poids fort du rsultat sont placs dans le registre hi, et les 32 bits de poids faible dans lo. lo <= (ri x rj)310 hi <= (ri x rj)6332 Exception: pas dexception.

multu
Multiplication non-signe

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

16

UNIVERSITE PIERRE ET MARIE CURIE Syntaxe : multu $ri, $rj

LICENCE INFORMATIQUE

Description : Le contenu du registre $ri est multipli par le contenu du registre $rj, le contenu des deux registres tant considr comme des nombres non signs. Les 32 bits de poids fort du rsultat sont placs dans le registre hi, et les 32 bits de poids faible dans lo. lo <= (ri x rj)310 hi <= (ri x rj)6332 Exception: pas dexception.

nor
Non-ou bit--bit registre registre Syntaxe : nor $rr, $ri, $rj Description : Un non-ou bit--bit est effectu entre les contenus des registres $ri et $rj. Le rsultat est plac dans le registre $rr. rr <= ri nor rj Exception: pas dexception.

or
Ou bit--bit registre registre Syntaxe : or $rr, $ri, $rj Description: Un ou bit--bit est effectu entre les contenus des registres $ri et $rj. Le rsultat est plac dans le registre $rr. rr <= ri or rj Exception: pas dexception.

ori
Ou bit--bit registre immdiat Syntaxe : ori $rr, $ri, imm Description : La valeur immdiate sur 16 bits subit une extension de zros. Un ou bit--bit est effectu entre cette valeur tendue et le contenu du registre $ri pour former un rsultat plac dans le registre $rr. rr <= (016 || imm 150) or ri Exception: pas dexception.

rfe
Restauration des bits d'tat en fin de traitement d'exception Syntaxe : rfe 17

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Description: Recopie les anciennes valeurs des bits de masques d'interruption et de mode (noyau ou utilisateur) du registre d'tat SR la valeur qu'il avait avant l'excution du programme d'exception courant. sr <= sr 314 || sr 52

sb
Ecriture d'un octet en mmoire Syntaxe : sb $rj, imm($ri) Description : L'adresse d'criture est la somme de la valeur immdiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. L'octet de poids faible du registre $rj est crit l'adresse ainsi calcule. Mem[imm + ri] <= rj 70 Exceptions: - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini.

sh
Ecriture d'un demi-mot en mmoire Syntaxe : sh $rj, imm($ri) Description : L'adresse d'criture est la somme de la valeur immdiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. Le bit de poids faible de cette adresse doit tre zro (adresse multiple de 2). Les deux octets de poids faible du registre $rj sont crits l'adresse ainsi calcule. Mem[imm + ri] <= rj 150 Exceptions: - Adresse non aligne sur une frontire de demi-mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini.

sll
Dcalage gauche immdiat Syntaxe : sll $rr, $ri, imm Description : Le registre est dcal gauche de la valeur immdiate code sur 5 bits, des zros tant introduits dans les bits de poids faibles. Le rsultat est plac dans le registre $rr. rr <= ri (31 imm)0 || 0imm Exception: pas dexception.

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

18

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

sllv
Dcalage gauche registre Syntaxe : sllv $rr, $ri, $rj Description : Le registre $ri est dcal gauche du nombre de bits spcifis dans les 5 bits de poids faible du registre $rj, des zros tant introduits dans les bits de poids faibles. Le rsultat est plac dans le registre $rr. rr <= ri (31 rj)0 || 0 rj Exception: pas dexception.

slt
Comparaison signe registre registre Syntaxe : slt $rr, $ri, $rj Description : Le contenu du registre $ri est compar au contenu du registre $rj, les deux valeurs tant considres comme des nombres signs. Si la valeur contenue dans $ri est strictement infrieure celle contenue dans $rj, alors $rr prend la valeur un, sinon il prend la valeur zro. If (ri < rj) rr <= 1 else rr <= 0 Exception: pas dexception.

slti
Comparaison signe registre immdiat Syntaxe : slti $rr, $ri, imm Description : Le contenu du registre est compar la valeur immdiate sur 16 bits qui a subi une extension de signe. Les deux valeurs sont considres comme des nombres signs. Si la valeur contenue dans $ri est strictement infrieure celle de limmdiat, alors $rr prend la valeur un, sinon il prend la valeur zro. If (ri <(imm1516 || imm 150 )) rr <= 1 else rr <= 0 Exception: pas dexception.

sltiu
Comparaison non-signe registre immdiat Syntaxe : sltiu $rr, $ri, imm Description : Le contenu du registre est compar la valeur immdiate sur 16 bits qui a subi une extension de signe.

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

19

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Les deux valeurs tant considres comme des nombres non-signs, si la valeur contenue dans $ri est strictement infrieur celle de l'immdiat tendu, alors $rr prend la valeur un, sinon $rr prend la valeur zro. if (ri < (imm1516 || imm 150 )) rr <= 1 else rr <= 0 Exception: pas dexception

sltu
Comparaison non-signe registre registre Syntaxe : sltu $rr, $ri, $rj Description : Le contenu du registre $ri est compar au contenu du registre $rj, les deux valeurs tant considres comme des nombres non-signs. Si la valeur contenue dans ri est strictement infrieure celle contenue dans $rj, alors $rr prend la valeur un, sinon il prend la valeur zro. If (ri < rj) rr <= 1 else rr <= 0 Exception: pas dexception

sra
Dcalage droite arithmtique immdiat Syntaxe : sra $rr, $ri, imm Description : Le registre $ri est dcal droite de la valeur immdiate code sur 5 bits, le bit de signe du registre $ri tant introduit dans les bits de poids fort. Le rsultat est plac dans le registre . rr <= (ri31) imm || (ri) 31imm Exception: pas dexception

srav
Dcalage droite arithmtique registre Syntaxe : srav $rr, $ri, $rj Description : Le registre $ri est dcal droite du nombre de bits spcifi dans les 5 bits de poids faible du registre $rj, le bit de signe de $ri tant introduit dans les bits de poids fort. Le rsultat est plac dans le registre $rr. rr <= (ri31) rj || (ri) 31rj Exception: pas dexception

srl
Dcalage droite logique immdiat 20

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Syntaxe : srl $rr, $ri, imm Description : Le registre est dcal droite de la valeur immdiate code sur 5 bits, des zros tant introduits dans les bits de poids fort. rr <= 0 imm || ri 31imm Exception: pas dexception

srlv
Dcalage droite logique registre Syntaxe : srlv $rr, $ri, $rj Description : Le registre $ri est dcal droite du nombre de bits spcifi dans les 5 bits de poids faible du registre $rj des zros tant introduits dans les bits de poids fort ainsi librs. Le rsultat est plac dans le registre $rr . rr <= 0 rj || ri 31rj Exception: pas dexception

sub
Soustraction registre registre signe Syntaxe : sub $rr, $ri, $rj Description : Le contenu du registre $rj est soustrait du contenu du registre $ri pour former un rsultat sur 32 bits qui est plac dans le registre $rr. rr <= ri - rj Exception: gnration d'une exception si dpassement de capacit.

subu
Soustraction registre registre non-signe Syntaxe : sub $rr, $ri, $rj Description : Le contenu du registre $rj est soustrait du contenu du registre pour former un rsultat sur 32 bits qui est plac dans le registre . rr <= ri rj Exception: pas dexception

sw
criture d'un mot en mmoire Syntaxe : sw $rj, imm($ri)

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

21

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

Description : L'adresse d'criture est la somme de la valeur immdiate sur 16 bits, avec extension de signe, et du contenu du registre $ri. Les deux bits de poids faible de cette adresse doivent tre zro (adresse multiple de 4). Le contenu du registre $rj est crit en mmoire l'adresse ainsi calcule. Mem[imm + ri] <= rj

Exceptions: - Adresse non aligne sur une frontire de mot. - Adresse dans le segment noyau alors que le processeur est en mode utilisateur. - Adresse correspondant un segment non dfini

syscall
Appel une fonction du systme (en mode noyau). Syntaxe : syscall Description : Un appel systme est effectu, par un branchement inconditionnel au gestionnaire d'exception. Note : par convention, le numro de l'appel systme, c.--d. le code de la fonction systme effectuer, est plac dans le registre $2. Pc <= 0x80000080

xor
Ou-exclusif bit--bit registre registre Syntaxe : xor $rr, $ri, $rj Description : Un ou-exclusif bit--bit est effectu entre les contenus des registres $ri et $rj. Le rsultat est plac dans le registre $rr . rr <= ri xor rj Exception: pas dexception

xori
Ou-exclusif bit--bit registre immdiat Syntaxe : xori $rr, $ri, imm Description : La valeur immdiate sur 16 bits subit une extension de zros. Un ou-exclusif bit--bit est effectu entre cette valeur tendue et le contenu du registre $ri pour former un rsultat plac dans le registre $rr. rr <= (016 || imm 150) xor ri Exception: pas dexception

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

22

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

5/

MACRO-INSTRUCTIONS

Une macro-instruction est une pseudo-instruction qui ne fait pas partie du jeu d'instructions machine, mais qui est accepte par l'assembleur qui la traduit en une squence de plusieurs instructions machine. Les macro-instructions utilisent le registre $1 si elles ont besoin de faire un calcul intermdiaire. Il ne faut donc pas utiliser ce registre dans les programmes.

la
Chargement d'une adresse dans un registre Syntaxe : la $rr, adr Description : L'adresse considre comme une quantit non-signe est charge dans le registre . Code quivalent Calcul de adr par l'assembleur lui $rr, adr >> 16 ori $rr, $rr, adr & 0xFFFF

li
Chargement d'un oprande immdiat sur 32 bits dans un registre Syntaxe : li $rr, imm Description : La valeur immdiate est charge dans le registre .$rr . Code quivalent lui $rr, ori $rr,

imm >> 16 $rr, imm & 0xFFFF

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

23

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

6/

DIRECTIVES SUPPORTEES PAR L'ASSEMBLEUR MIPS

Les directives ne sont pas des instructions excutables par la machine, mais permettent de donner des ordres l'assembleur.Toutes ces pseudo-instructions commencent par le caractre . ce qui permet de les diffrencier clairement des instructions.

6.1) Dclaration des sections text, data et stack


Six directives permettent de spcifier quelle section de la mmoire est concerne par les instructions, macro-instructions ou directives qui les suivent. Sur ces six directives, deux sont dynamiquement gres lors de lexcution : ce sont celles qui concernent la pile utilisateur (stack), et la pile systme (kstack). Ceci signifie que l'assembleur gre quatre compteurs d'adresse indpendants correspondants aux quatre autres sections (text, data, ktext, kdata). Ces six directives sont: .text .data .stack .ktext .kdata .kstack Toutes les instructions ou directives qui suivent une de ces six directives, concernent la section correspondante.

6.2) Dclaration et initialisation de variables


Les directives suivantes permettent d'initialiser les valeurs contenues dans certaines sections de la mmoire (uniquement text, data, ktext, et kdata).

.align n
Description : Cette directive aligne le compteur d'adresse de la section concerne sur une adresse telle que les n bits de poids faible soient zro. Exemple .align 2 .byte 12 .align 2 .byte 24

.ascii chane, [autrechane]


Description : Cette directive place partir de l'adresse du compteur d'adresse de la section concerne la suite de caractres entre guillemets. S'il y a plusieurs chanes, elles sont places la suite. Cette chane peut contenir des squences d'chappement du langage C, et doit tre termine par un zro binaire si elle est utilis avec un appel systme. LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 24

UNIVERSITE PIERRE ET MARIE CURIE Exemple message: .ascii "Bonjour, Matre!\n\0"

LICENCE INFORMATIQUE

.asciiz chane, [autrechane]


Description : Cette directive oprateur est strictement identique la prcdente, la seule diffrence tant qu'elle ajoute un zro binaire la fin de chaque chane. Exemple message: .asciiz "Bonjour, Matre"

.byte n, [m]
Description : La valeur de chacune des expressions n,m, est tronque 8 bits, et les valeurs ainsi obtenues sont places des adresses successives de la section active. Exemple table: .byte 1, 2, 4, 8, 16, 32, 64, 32, 16, 8, 4, 2, 1

.half n, [m]
Description : La valeur de chacune des expressions n,m, est tronque 16 bits, et les valeurs ainsi obtenues sont places des adresses successives de la section active. Exemple coordonnes: .half 0 , 1024

.word n, [m]
Description: La valeur de chaque expression est place dans des adresses successives de la section active. Exemple entiers: .word -1, -1000, -100000, 1, 1000, 100000

.space n
Description : Un espace de taille n octets est rserv partir de l'adresse courante de la section active. Exemple nuls: .space 1024 # initialise 1024 octets de mmoire zro

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

25

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

7/

APPELS SYSTEME

Pour raliser certains traitements qui ne peuvent tre excuts que sous le contrle du systme dexploitation (typiquement les entres/sorties consistant lire ou crire un nombre, ou une chane de caractre sur la console), le programme utilisateur doit utiliser un appel systme, grce linstruction syscall. Par convention, le numro de l'appel systme est contenu dans le registre $2, et ses ventuels arguments dans les registres $4 et $5. Cinq appels systme sont actuellement supports dans l'environnement de simulation :

7.1) Ecrire un entier sur la console


Il faut mettre l'entier crire dans le registre $4 et excuter l'appel systme numro 1. li $4, ori $2, syscall 0x1234567 # stocke la valeur hexadcimale 1234567 dans $4 $0, 1 # code de print_integer dans $2 # affiche 1234567

On peut aussi crire sans macro-instruction : lui $4, 0x123 ori $4, $0, 0x4567# valeur hexadcimale 1234567 dans $4 ori $2, $0, 1 # code de print_integer dans $2 syscall # affiche 1234567

7.2) Lire un entier sur la console


La valeur de retour d'une fonction --- systme ou autre --- doit tre range par la fonction appele dans le registre $2. Ainsi, lire un entier consiste excuter l'appel systme numro 5 et rcuprer le rsultat dans le registre$2. ori $2, syscall $0, 5 # code de read_integer dans $2 # $2 contient la valeur lue

7.3) Ecrire une chane de caractres sur la console


Une chane de caractres tant identifie par un pointeur, il faut passer ce pointeur l'appel systme numro 4 pour l'afficher. str: .asciiz "Chane afficher\n" la $4, str # charge le pointeur dans $4 ori $2, $0, 4 # code de print_string dans $2 syscall # affiche la chaine pointe

On peut aussi crire sans macro-instruction : LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 26

UNIVERSITE PIERRE ET MARIE CURIE str:

LICENCE INFORMATIQUE

.asciiz "Chane afficher\n" lui $4, str >> 16 ori $4, $0, str & 0xFFFF # charge le pointeur dans $4 ori $2, $0, 4 # code de print_string dans $2 syscall # affiche la chaine pointe

7.4) Lire une chane de caractres sur la console


Pour lire une chane de caractres, il faut un pointeur dfinissant ladresse du buffer de rception en mmoire et un entier dfinissant la taille du buffer (en nombre de caractres). On crit la valeur du pointeur dans $4, et la taille du buffer dans $5, et on excute l'appel systme numro 8.

read:

.space 256 la $4, read ori $5, $0, ori $2, $0, syscall

152 8

# charge le pointeur dans $4 # charge longueur max dans $5 # code de read_string # copie la chane dans le buffer point par $4

On peut aussi crire sans macro-instruction : read: .space 256 lui $4, read >> 16 ori $4, $0, read & 0xFFFF # charge le pointeur dans $4 ori $5, $0, 152 # charge longueur max dans $5 ori $2, $0, 8 # code de read_string syscall # copie la chane dans le buffer point par $4

7.5) Terminer un programme


L'appel systme numro 10 effectue l'exit du programme au sens du langage C. ori $2, $0, 10 # code de exit syscall # quitte pour de bon

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

27

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

8/

CONVENTIONS POUR LES APPELS DE FONCTIONS

L'excution de fonctions ncessite une pile en mmoire. Cette pile correspond la section stack. L'utilisation de cette pile fait l'objet de conventions qui doivent tre respectes par la fonction appele et par la fonction appelante. Les conventions dfinies ci-dessous sont fortement inspires des conventions utilises par le compilateur GCC. La pile s'tend vers les adresses dcroissantes . Le pointeur de pile pointe toujours sur le dernier mot occupe dans la pile. Ceci signifie que tous les mots d'adresse infrieure au pointeur de pile sont libres. Le R3000 ne possde pas d'instructions spcifiques la gestion de la pile. On utilise les instructions lw et sw pour y accder. Les appels de fonction utilisent un pointeur particulier, appel pointeur de pile. Ce pointeur est stock conventionnellement dans le registre $29. La valeur de retour d'une fonction est conventionnellement crite, dans le registre $2, par la fonction appele. Par ailleurs, l'architecture matrielle du processeur MIPS R3000 impose l'utilisation du registre $31 pour stocker l'adresse de retour lors d'un appel de fonction.

chaque appel de fonction est associe une zone dans la pile constituant le contexte d'excution de la fonction. Dans le cas des fonctions rcursives, une mme fonction peut tre appele plusieurs fois et possdera donc plusieurs contextes d'excution dans la pile. Lors de l'entre dans une fonction, les registres $8 $26 sont disponibles pour tout calcul dans cette fonction ; mais le contenu des registres utiliss doit tre sauvegard et restaur avant le retour au programme appelant. Dans le cas gnral, un contexte d'excution d'une fonction est constitu de trois zones qui sont, dans l'ordre d'empilement : La zone des arguments de la fonction appele Les valeurs des arguments sont crites dans la pile par la fonction appelante et lues dans la pile par la fonction appele. Dans la suite de ce document, on note na le nombre darguments, et on considre que tous les arguments sont reprsents par des mots de 32 bits. Par convention, on place toujours le premier argument de la fonction appele l'adresse la plus petite dans la zone des arguments. La zone de sauvegarde des registres La fonction appele est charge de sauvegarder le registre $31, ainsi que les registres de travail quelle utilise de faon pouvoir restaurer la valeur de ces registres avant de rendre la main la fonction appelante. Dans la suite de ce document, on note nr le nombre de registres sauvegards en plus du registre $31. Seuls les registres dindice suprieur 7 doivent tre sauvegards (sils sont utiliss). Le registre $31 contenant ladresse de retour est toujours sauvegard ladresse la plus grande de la zone de sauvegarde. La zone des variables locales de la fonction appele. Les valeurs stockes dans cette zone ne sont en principe lues et crites que par la fonction appele. Elle est utilise pour stocker les variables et structures de donnes locales la fonction. Dans la suite de ce document, on note nv le nombre de mots de 32 bits constituant la zone des variables locales. LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 28

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

8.1) Organisation de la pile


Dans le cas gnral, une fonction f souhaite appeler une fonction g. La fonction g possde des arguments, utilise des registres et possde des variables locales. La fonction f appelante doiteffectuer la squence suivante : dcrmenter le pointeur de pile: $29 <= $29 4*na, de faon rserver la place dans la pilepour les arguments. crire dans la pile les valeurs des na arguments de la fonction g, en mettant le premier argument l'adresse pointe par $29, le deuxime $29 +4, etc... effectuer le branchement la premire instruction de la fonction appele en utilisant une instruction de type jal ou bgezal. incrmenter le pointeur de pile pour restaurer la valeur quil avait avant lappel de la fonction g: $29 <= $29 + 4*na

La fonction g appele est dcoupe en trois parties. La premire partie est le prologue, qui commence par dcrmenter le pointeur de pile de faon rserver la place pour la sauvegarde du registre $31 et des registres qui seront utiliss par g, ainsi que la place ncessaire aux variables locales de g. Le prologue sauvegarde ensuite dans la pile : la valeur du registre $31 et les valeurs des registres qui seront utiliss par g. La deuxime partie est le corps de la fonction qui effectue les calculs, en utilisant les registres ncessaires ainsi que les variables locales stockes dans la pile, puis crit la valeur de retour dans le registre $2. La troisime partie est lpilogue charg de : restaurer les valeurs des registres sauvegards dans la pile, dincrmenter le pointeur de pile pour lui redonner la valeur quil avait en entrant dans la fonction g. Le prologue de la fonction g doit effectuer la squence suivante: dcrmenter le pointeur de pile: $29 <= $29 4*(nv + nr + 1) crire successivement dans la pile suivant les adresses dcroissantes la valeur du registres $31 et des nr registres qui seront utiliss par le corps de la fonction. lire dans la pile les arguments de la fonction g et les stocker dans les registres utiliss par le corps de la fonction g.

Lpilogue de la fonction g doit effectuer la squence suivante: lire dans la pile les valeurs des (nr +1) registres sauvegards (dont le registre $31) et restaurer les valeurs quavaient les registres avant lappel de la fonction g. incrmenter le pointeur de pile: $29 <= $29 + 4*(nv + nr + 1) effectuer un branchement ladresse de retour contenue dans le registre $31

On note R(i) les registres utiliss par la fonction appele, qui doivent tre sauvegards. On note A(i) les registres utiliss dans l'appelant pour stocker les arguments. On note P(i) les registres utiliss dans l'appel pour la rcupration des arguments. On note v(i) les variables locales dclares dans la fonction appele Le code crire est donc le suivant. LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 29

UNIVERSITE PIERRE ET MARIE CURIE Dans f: ... addiu sw ... sw jal addiu ... $29, $A(0), $A(na -1), g $29, $29, -4*na 0 ($29) 4*(na -1) ($29) $29, 4*na

LICENCE INFORMATIQUE

# dcrmentation pointeur de pile # criture premier argument # criture dernier argument # branchement la fonction g # incrmentation pointeur de pile

Dans g: # prologue g: addiu $29, sw $31, sw $R(0), ... sw $R(nr -1), lw $P(0), ... lw $P(na -1), # corps de la fonction ... # epilogue lw $31, lw $R(0), ... lw $R(nr-1), addiu $29, jr $31

$29, - 4*(nv + nr + 1) 4*(nv +nr )($29) 4*(nv + nr - 1)($29) 4*nv($29) 4*( nr + nv + 1)($29) 4*(na + nr + nv)($29)

# dcrmentation pointeur de pile # sauvegarde registre $31 # sauvegarde premier registre # sauvegarde dernier registre # rcupration premier argument # rcupration dernier argument

4*(nv + nr)($29) 4*(nv + nr 1)($29) 4*nv($29) $29, 4*(nv + nr + 1)

# restauration registre $31 # restauration premier registre # restauration dernier registre # incrmentation pointeur de pile # branchement adresse de retour

Adresses hautes de la pile A(na-1) A(1) A(0) $31 R(0) R(1) R(nr-1) V(0) V(1) V(nv-1) Adresses basses de la pile LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 30 $29 valeur initiale

Zone des arguments

$29 aprs le jal dans f adresse de retour

Zone de sauvegarde des registres

Zone des variables locales

$29 aprs pilogue dans g

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

8.2) Exemple
On traite ici lexemple d'une fonction calculant la norme dun vecteur (x,y), en supposant qu'il existe une fonction int isqrt(int x) qui retourne la racine carre d'un nombre entier. Les coordonnes du vecteur sont des variables globales initialises dans le segment data. Ceci correspond au code C ci-dessous: int int x= y= 5; 4;

int main() { printf (%x, norme(x,y) ); } int norme (int a, int b) { int somme, val; somme = a * a + b * b; val = isqrt(somme); return val; }

/* Variables locales */

La fonction main() n'est pas une fonction comme les autres puisqu'elle n'est appele par personne. Elle apple la fonction norme() qui a deux arguments, donc na = 2. La fonction norme() a deux variables locales dclares (somme et val). Elle utilise deux registres de travail ($7 et $8). On a donc nv = 2 et nr = 2. Les deux fonction isqrt() et norme() renvoient leur rsultat dans le registre $2. Le programme assembleur est le suivant : .data x: y: .text __start: addiu la lw sw la lw sw jal addiu or ori syscall ori syscall $29, $29, -8 $8, x $9, 0($8) $9, 0($29) $8, y $9, 0($8) $9, 4($29) norme $29, $29, +8 $4, $2, $0 $2, $0, 1 $2, $0, 10 # dcrmentation pointeur de pile # Ecriture 1er paramtre dans la pile # Ecriture 2e paramtre dans la pile

.word .word

5 4

# incrmentation pointeur de pile # rcupration rsultat norme dans $4 # code de print_integer dans $2 # affichage rsultat sur la console # code de exit dans $2 # sortie du programme 31

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

UNIVERSITE PIERRE ET MARIE CURIE

LICENCE INFORMATIQUE

norme : # prologue addiu sw sw sw lw lw # corps de la fonction mult mflo mult mflo addu addiu sw jal addiu # pilogue lw sw sw addiu jr

$29, $31, $8, $9, $8, $9,

$29, -20 +16($29) +12($29) + 8($29) +20($29) +24($29)

# dcrmentation pointeur de pile # sauvegarde adresse de retour # sauvegarde registre de travail $8 # sauvegarde registre de travail $9 # rcupration 1er paramtre "a" # rcupration 2e paramtre "b"

$8, $8 $9, $9 $8, $29, $8, isqrt $29, $31, $8, $9, $29, $31

$8 $9 $8, $9 $29, -4 0($29)

# calcul a*a # calcul b*b # calcul somme # dcrmentation pointeur de pile # criture paramtre isqrt dans la pile # branchement la fonction isqrt # le rsultat est dans $2 # incrmentation pointeur de pile # restaure adresse de retour # restaure registre de travail $8 # restaure registre de travail $9 # incrmentation pointeur de pile # retour la fonction appelante

$29, +4 +16($29) +12($29) +8($29) $29, +20

LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2)

32

Vous aimerez peut-être aussi