Chap2 2mipsisa
Chap2 2mipsisa
Chap2 2mipsisa
add a,b,c
R0 0
R1
…
R31
CP
LO
HI
19/10/2012 12:39 I.Abdesslem 4
les instructions. 4
Les registres du MIPS
f=(g+h)-(i+j);
Load
Processeur Mémoire
Store
Adresse Donnée
0 10
4 45
Processeur 8 8456666
12 0
... ...
Numéro d’octet
3 2 1 0 Motorolla, MIPS, SPARC
Numéro d’octet
Intel 8086, VAX, Alpha
0 1 2 3
Chargement mot :
lw $1,100($2)
$1 = Mémoire[$2+100]
Rangement mot :
sw $1,100($2)
Mémoire[$2+100] = $1
T[i]=h+T[i] ;
les instructions. 14
Exemple
if (i==j)
f=g+h;
else
f=g-h;
les instructions. 15
Exemple
While (stock[i]==k)
i=i+j;
les instructions. 16
Le format des instructions
Instruction de type R
31-26 25-21 20-16 15-11 10-6 5-0
0 rs rt rd decval fonct
Exemples :
les instructions. 18
Le format des instructions
Instruction de type I
Instruction de chargement ou de rangement
31-26 25-21 20-16 15-0
35ou43 rs rt adresse
6 bits 5 bits 5 bits 16 bits
Exemples :
lw $1,100($2) signification : $1=Mémoire($2+100)
35 2 1 100
Sw $1,100($2) signification : Mémoire($2+100)=$1
43 2 1 100
les instructions. 19
Le format des instructions
Instruction de branchement
31-26 25-21 20-16 15-0
4 ou 5 rs rt adresse
Exemples :
beq $1,$2,100 signification : si ($1=$2) aller en 100
4 1 2 100
les instructions. 20
Le format des instructions
• Instruction type J
op adresse
6 bits 26 bits
Exemple : J 2000
2 2000
6 bits 26 bits
31 26 21 16 11 6 0
R-type op rs rt rd decval funct add, sub
les instructions. 21
Modes d’adressage
1. Adressage par registre
31 26 21 16 11 6 0
op rs rt rd decval funct
registre
Opérande est un registre Add $4,$2,$3
2. Adressage indexé
op rs rt adresse
registre
+ Mémoire
lw $1,100($2)
Opérande se trouve à
l’emplacement mémoire
les instructions. 22
Modes d’adressage
3. Adressage immédiat
op rs rt immédiat
6 bits 5 bits 5 bits 16 bits
4. Adressage relatif à CP
op rs rt adresse
CP
les instructions. 24
L’utilisation de la mémoire
7fffffff
Segment de pile
Segment de
données
10000000
Segment de texte
00400000 Réservé
les instructions. 25
Traitement des procédures
Procédure A
0: procédure A
Éditeur
Procédure B de 64: procédure B
liens
112:procédure C
Procédure C
Appel de procédure.
Retour à l’instruction qui suit l’appel.
Passage des paramètres
Imbrication des procédure
les instructions. 26
Traitement des procédures
Void procB(){
procC();
}
Void procA(){
procB();
}
les instructions. 28
Appels et retours
Retour
Retour
les instructions. 29
Les appels de procédures
Void procB(){
procC();
}
Void procA(){
procB();
}
jal AdresseProcedure :
Affecte un saut à une adresse donnée en
sauvegardant l’adresse de l’instruction suivante dans
le registre $31
jr $31
Instruction qui fait un saut de retour
les instructions. 30
Sauvegarde et restitution de l’adresse de retour
procA:...
... $31
Mémoire
jal procB
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29)
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 31
Après que procA ai appelé procB
procA:...
... $31
Mémoire
jal procB ad ret procB
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29)
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 32
Juste avant que procB n’appelle procC
procA:...
... $31
Mémoire
jal procB ad ret procB
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29)
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 33
Juste avant que procB n’appelle procC
procA:...
... $31
Mémoire
jal procB ad ret procB
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29) ad ret procB
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 34
Appel
procA:...
... $31
Mémoire
jal procB ad ret procC
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29) ad ret procB
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 35
Après que procB ait appelé procC
procA:...
... $31
Mémoire
jal procB ad ret procC
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29) ad ret procB
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 36
procA:...
... $31
Mémoire
jal procB ad ret procC
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29) ad ret procB
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 37
Juste avant que procB ne retourne
procA:...
... $31
Mémoire
jal procB ad ret procB
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29) ad ret procB
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 38
Juste avant que procB ne retourne
procA:...
... $31
Mémoire
jal procB ad ret procB
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29) ad ret procB
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 39
Retour à procA
procA:...
... $31
Mémoire
jal procB ad ret procB
...
procB:... $29
...
addi $29,$29,-4
sw $31,0($29) ad ret procB
jal procC
lw $31,0($29)
addi$29,$29,4
...
jr $31
procC:...
...
jr $31
les instructions. 40
instructions arithmétiques
Instruction Exemple signification
add add $1,$2,$3 $1 = $2 + $3 exception possible
sous sub $1,$2,$3 $1 = $2 – $3 exception possible
add immediate addi $1,$2,100 $1 = $2 + 100 exception possible
add non signé addu $1,$2,$3 $1 = $2 + $3 pas d’exception
sous non signé subu $1,$2,$3 $1 = $2 – $3 pas d’exception
add imm. non sig addiu $1,$2,100 $1 = $2 + 100 pas d’exception
mul mult $2,$3 Hi, Lo = $2 x $3
Mul non signé multu$2,$3 Hi, Lo = $2 x $3
div div $2,$3 Lo = $2 ÷ $3, Lo = quotient
Hi = $2 mod $3 Hi = reste
div non signé divu $2,$3 Lo = $2 ÷ $3,
Hi = $2 mod $3
Move from Hi mfhi $1 $1 = Hi
Move from Lo mflo $1 $1 = Lo les instructions. 41
instructions logiques
Instruction Exemple Signification
and and $1,$2,$3 $1 = $2 ET $3
or or $1,$2,$3 $1 = $2 OR $3
xor xor $1,$2,$3 $1 = $2 XOR $3
nor nor $1,$2,$3 $1 = $2 NOR $3
and immediat andi $1,$2,10 $1 = $2 ET 10
or immediat ori $1,$2,10 $1 = $2 OU 10
xor immediat xori $1, $2,10 $1 = $2 XOR 10
shift left logical sll $1,$2,10 $1 = $2 << 10
shift right logical srl $1,$2,10 $1 = $2 >> 10
shift right arithm. sra $1,$2,10 $1 = $2 >> 10
shift left logical sllv $1,$2,$3 $1 = $2 << $3
shift right logical srlv $1,$2, $3 $1 = $2 >> $3
shift right arithm. srav $1,$2, $3 $1 = $2 >> $3
les instructions. 42
instructions de transfert de données
Instruction Comment
sw $3, 500($4) enreg. D’un mot en mémoire
sh $3, 502($2) enreg. D’un demi-mot
sb $2, 41($3) enreg. D’un octet
lui $1, 40 Load Upper Immediate (16 bits shifted left par 16)
LUI $1 0040
les instructions. 44
Langage machine et langage assembleur
les instructions. 45
C’est quoi le SPIM ?
les instructions. 46
1-Instructions et pseudo-instructions
Les instructions (RISC) étant très élémentaires, on
ajoute des pseudo-instructions, qui n’existent pas
réellement pour le processeur, mais sont traduites
vers une suite d’instructions réelles par l’assembleur.
Par exemple,
les instructions. 47
1.Instructions et pseudo-instructions
Ou encore,
l i $t0,0xA400020
est expansée en
lui $at,0x0A40
ori $t0, $at,0x0020
les instructions. 48
2.Les commentaires :
Un commentaire sera toujours précédé par un ‘#’ .
# <commentaire>
Exemple :
#################
#-----Programme-----#
#################
les instructions. 49
3.Les chaines de caractères :
Exemple :
.asciiz “Hello world !\n”
newline(retour-chariot) \n
tabulation \t
les instructions. 50
4.Les directives de SPIM :
les instructions. 51
4.Les directives de SPIM :(Suite)
Exemples :
.data : déclaration du segment de données.
les instructions. 52
4.Les directives de SPIM :(Suite)
les instructions. 53
5.Les appels système :
$v0
$a0-$a3 syscall
$a0
$v0
les instructions. 54
4.Les appels système ( Suite ) :
Nom No Effet
print_int 1 imprime l'entier contenu dans a0
print_string 4 imprime la chaîne en a0 jusqu'à '\000'
read_int 5 lit un entier et le place dans v0
Lecture d’une chaîne
read_string 8 L’adresse du buffer en a0
La longeur de la chaîne en a1
exit 10 arrêt du programme en cours d'exécution
les instructions. 55
Un exemple complet 1: Factorielle (itératif)
.data
str1: .asciiz " Entrez un entier :"
str2: .asciiz "Sa factorielle est «
.text
main: li $v0 , 4 # system call code for print_str
la $a0 , str1 # address of string to print
syscall # print the string
les instructions. 56
Un exemple complet 1: Factorielle (itératif)
li $3 , 1 # initialisation du resultat
loop: blt $v0,1,sortie # Si $v0 <1, on sort
mul $3,$v0,$3
sub $v0,$v0,1
b loop # sinon , $3=$3*$v0 , $v0 =$v0 -1
les instructions. 57
Un exemple complet 1: Factorielle (itératif)
li $v0,1 # system call code for print_int
move $a0,$3 # integer to print
syscall # print the integer
les instructions. 58
Fonctions récursives
int f (int n)
{
if (n<= 0)
return 1;
else
return n*f(n − 1);
}
les instructions. 59
Fonctions récursives
• Parce que fact est récursive, plusieurs appels imbriqués
peuvent être actifs simultanément :
a0 a0 – 1
a0 a0 – 1
fact fact
v0 a0 x v0
v0 a0 x v0
L’appel récursif modifie a0 . en fait, il en détruit le contenu.
Or, celui-ci est utilisé après l’appel.
Il faut donc sauvegarder le contenu de a0 avant l’appel, puis
le restaurer après l’appel. (Et de même pour $ra.)
les instructions. 60
La pile
• Par convention, la pile grandit dans le sens des adresses
décroissantes. Le registre $sp pointe vers le sommet de la
pile, c’est-`a-dire vers le dernier mot alloué.
On sauvegarde le contenu de a0 sur la pile comme ceci :
les instructions. 61
Factorielle (récursive)
. data
str1 : . asciiz " Entrez un entier :"
str2 : . asciiz "Sa factorielle est "
. text
main : li $v0 , 4 # system call code for print_str
la $a0 , str1 # address of string to print
syscall # print the string
li $v0 , 5 # system call code for read_int
syscall # read int , result in $v0
move $a0,$v0
jal fact
sortie : move $16,$v0
li $v0 , 4 # system call code for print_str
la $a0 , str2 # address of string to print
syscall # print the string
li $v0 ,1 # system call code for print_int
move $a0 ,$16 # integer to print
syscall # print the integer
li $v0 ,10 # on sort proprement du programme
les instructions.
Syscall 62
Factorielle (récursive)
fact : blez $a0, fact 0 # si a0 <= 0 saut a fact 0
sub $sp, $sp, 8 # reserve deux mots en pile
sw $ra, 0( $sp) # sauve l'adresse de retour
sw $a0, 4($sp) # et la valeur de a0
sub $a0, $a0, 1 # decrement a0
jal fact # appel recursif (a0-1)
lw $a0, 4($sp) # recupere a0
mul $v0, $v0, $a0 # v0 a0 x v0
lw $ra, 0( $sp) # recupere l' adresse de retour
add $sp, $sp, 8 # libere la pile
j $ra # retour a l ' appelant
fact 0 : li $v0, 1 # v0 1
j $ra # retour a l ' appelant
les instructions. 63