LICENCE INFORMATIQUE
JeanLou Desbarbieux Franois Dromard Alain Greiner Frdric Ptrot Franck Wajsburt
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.
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.
LICENCE INFORMATIQUE
Segment noyau .kdata 0xC0000000 0xBFFFFFFF .ktext 0x80000000 0x7FFFFFFF Reserved 0x7FFFF000 0x7FFFEFFF .stack Segment utilisateur
LICENCE INFORMATIQUE
3/
RGLES SYNTAXIQUE
LICENCE INFORMATIQUE
Attention: sont illgaux les labels qui ont le mme nom qu'un mnmonique de l'assembleur.
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
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
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
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
10
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
11
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
12
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).
13
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
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
15
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
16
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
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.
18
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.
19
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
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)
21
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
22
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,
23
LICENCE INFORMATIQUE
6/
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.
.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
LICENCE INFORMATIQUE
.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
25
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 :
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
On peut aussi crire sans macro-instruction : LANGAGE DASSEMBLAGE MIPS R3000 (Version 2.2) 26
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
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
27
LICENCE INFORMATIQUE
8/
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
LICENCE INFORMATIQUE
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
# 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
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
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
# 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
# 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
32