Académique Documents
Professionnel Documents
Culture Documents
Code Assembleur
Processeurs RISC
(Byte code).
Didier Remy
Octobre 2000
http://cristal.inria.fr/remy/poly/compil/1/
http://w3.edu.polytechnique.fr/profs/informatique//Didier.Remy/compil/1/
Informations utiles
La pico-machine d
ecrite dans le livre Le langage Caml de
Pierre Weis et Xavier Leroy.
Le simulateur SPIM du processeur MIPS R2000 est pr
esent
e
succinctement ci-dessous. Voir aussi son manuel de r
ef
erence
en ligne et en Postscript.
Slide 1
Les processeurs
Les processeurs se ressemblent tous du point de vue de
lutilisateur (i.e. de la partie visible de leur architecture). Ils
comportent principalement une m
emoire, un ensemble de
registres, et un jeu dinstructions.
Les diff
erences proviennent surtout du jeu dinstructions :
Les (vieux) processeurs CISC (Complex Instruction Set)
Slide 2
La m
emoire
Tous les processeurs modernes comportent une unit
e m
emoire
(MMU) qui permet de manipuler des adresses virtuelles, i.e. de
faire un renommage, transparent pour lutilisateur, entre les
adresses virtuelles du programme et les adresses r
eelles en
m
emoire.
Slide 3
Cela permet `
a chaque programme de choisir ses adresses
ind
ependemment des autres programmes (qui peuvent
etre
ex
ecut
es en m
eme temps sur la m
eme machine avec les m
emes
adresses virtuelles mais des adresses r
eelles diff
erentes).
Du point de vue de lutilisateur, la m
emoire est un (grand)
tableau dont les indices sont les adresses.
Les zones m
emoire
Adresses hautes
Stack
Donn
ees dynamiques
Slide 4
Allou
ee dynamiquement
Donn
ees statiques
Modifiable
Texte (programme)
Non
ecrivable
Adresses basses
R
eserv
e au syst`
eme
Slide 5
Le jeu dinstructions
Slide 6
Slide 7
une
etiquette (adresse)
nom de registre
absolu (n ou `)
op
erande (r ou a)
Syntaxe
Effet
Syntaxe
Effet
move r1 , r2
r1 r2
lw r1 , o(r2 )
r1 tas.(r2 + o)
add r1 , r2 , o
r1 o + r2
sw r1 , o(r2 )
r1 tas.(r2 + o)
sub r1 , r2 , o
r1 r2 o
slt r1 , r2 , o
r1 r2 < o
mul r1 , r2 , o
r1 r2 o
sle r1 , r2 , o
r1 r2 o
div r1 , r2 , o
r1 r2 o
seq r1 , r2 , o
r1 r2 = o
and r1 , r2 , o
r1 r2 land o
sne r1 , r2 , o
r1 r2 6= o
or r1 , r2 , o
r1 r2 lor o
j o
pc o
xor r1 , r2 , o
r1 r2 lxor o
jal o
ra pc + 1 pc o
sll r1 , r2 , o
r1 r2 lsl o
beq r, o, a
pc a si r = o
srl r1 , r2 , o
r1 r2 lsr o
bne r, o, a
pc a si r 6= o
li r1 , n
r1 n
syscall
appel syst`
eme
la r1 , a
r1 a
nop
ne fait rien
Nom
No
Effet
print int
print string
read int
sbrk
exit
10
arr
et du programme en cours dex
ecution
Slide 9
Pseudo-instructions
La d
ecompilation du langage machine en langage assembleur est
facile. Elle permet de pr
esenter les instructions machine (mots de
32 bits) sous une forme plus lisible.
Exemple dexpansion (pr
esent
ee sous une forme d
ecompil
ee).
Slide 10
Assembleur
Langage machine
Commentaire
blt r, o, a
slt $1, r, o
r
eserv
e par lassembleur.
lui $1, 6
li
$t0, 400020
La pico-machine
Cest une machine invent
ee (Pierre Weis et Xavier Leroy) pour
des raisons p
edagogiques.
Cest un mod`
ele simplifi
e de machine RISC, tr`
es proche du MIPS.
Son jeu dinstructions est (pas tout `
a fait) un sous-ensemble du
MIPS.
Slide 11
Pico code
signification
nom r1 , o, r2
nom r2 , o, r1
r1 o nom r2
. data
. asciiz
. text
. globl
hello \n
start
start :
Slide 12
li
$v0, 4
la
$a0, hello
syscall
start.
if-then-else
On utilise des sauts conditionnels et inconditionnels :
Pascal la fonction minimun
if t1 < t2 then t3 := t1 else
t3 := t2
Assembleur Mips
Slide 13
Then:
End:
blt
$t1, $t2, Then
move $t3, $t2
j
End
move $t3, $t1
#
#
#
#
#
si t1 >= t2 saut `
a Then
t3 := t1
saut `
a Fi
t3 := t2
suite du programme
Boucles
Pascal : calcule dans t2 = 0 la somme des entiers de 1 `
a t1
while t1 > 0 do begin t2 := t2 + t1; t1 := t1 1 end
Code Mips
Programme
equivalent
Slide 14
While:
if t1 <= 0 then goto End
else
begin
t2 := t2 + t1;
t1 := t1 1;
goto While
end;
End:
While:
ble
Appel de proc
edure
Pour appeler une proc
edure, il faut sauver ladresse de retour `
a
lappel, en g
en
eral dans $ra, pour revenir apr`
es lappel.
` la fin dune proc
A
edure, on retourne `
a lappelant en sautant `
a
ladresse contenu dans $ra.
Slide 15
Par exemple on d
efinit une proc
edure writeln qui imprime un
entier puis un retour `
a la ligne.
writeln :
li
$v0, 1
syscall
li
$v0, 4
la $a0, nl
syscall
j
$ra
#
#
#
#
#
# saut `
a l adresse ra
Le programme complet
nl :
. data
. asciiz
. text
. globl
\n
# le tas
# la chane \n
# la z
one code
start
start :
li
jal
li
jal
j
Slide 16
$a0, 1
writeln
$a0, 2
writeln
Exit
# a0 < 1
# ra < pc+1; saut `
a writeln
# on recommence avec 2
# saut `
a la fin du programme
writeln :
...
Exit:
# fin du programme
Noter la diff
erence entre les instructions j et jal.
Proc
edures r
ecursives
Slide 17
Lorsquune proc
edure est r
ecursive plusieurs appels imbriqu
es
peuvent
etre actifs simultan
ement :
a0 v0 1
a0 v0 1
fn
fn1
...
v0 v0 a0
v v a
0
0
0
Cest bien s
ur le m
eme code qui est utilis
e pour fn et fn1 . Il faut
donc sauver avant lappel r
ecursif la valeur des registres qui
seront (ou risque d
etre) modifi
es par lappel r
ecursif et dont les
valeurs seront encore n
ecessaires (lues) au retour de lappel.
On utilise la pile.
La pile
Par convention, la pile grossit vers les adresses d
ecroissantes. Le
registre sp pointe vers le dernier mot utilis
e.
Pour sauver un registre r sur la pile
sub $sp, $sp, 4
sw r , 0( $sp)
Slide 18
En g
en
eral, on alloue et d
esalloue lespace en pile par blocs pour
plusieurs temporaires `
a la fois.
On peut aussi utiliser la pile pour allouer des tableaux si leur
dur
ee de vie le permet.
Conventions dappel
Slide 19
En g
en
eral :
les arguments sont pass
es dans les registres a0 `
a a3 puis dans
la pile.
la ou les valeurs de retour dans v0 et v1.
De m
eme :
les registres ti sont sauv
es par lappelant (lappel
e peut les
ecraser)
les registres si sont sauv
es par lappel
e (qui doit les remettre
dans l
etat o`
u il les a pris)
Mais ce nest quune convention ! (celle propos
e par le fabriquant)
La respecter permet de comminiquer avec dautres programmes
(qui la respectent
egalement).
Choisir une autre convention est possible tant que lon nint
eragit
pas avec le monde ext
erieur.
10
Slide 20
blez
sub
sw
sw
sub
jal
lw
mul
lw
add
j
fact 0 : li
j
si a0 <= 0 saut `
a fact 0
r
eserve deux mots en pile
sauve ladresse de retour
et la valeur de a0
d
ecr
ement a0
v0 < appel r
ecursif (a01)
r
ecup
ere a0
v0 < a0 v0
r
ecup
ere l adresse de retour
lib`
ere la pile
retour `
a l appelant
$a0, fact 0
$sp, $sp, 8
$ra, 0( $sp)
$a0, 4($sp)
$a0, $a0, 1
fact
$a0, 4($sp)
$v0, $v0, $a0
$ra, 0( $sp)
$sp, $sp, 8
$ra
#
#
#
#
#
#
#
#
#
#
#
$v0, 1
$ra
# v0 < 1
# retour `
a l appelant
#
#
#
#
proc
edure dallocation dynamique
appel syst`
eme n. 9
alloue une taille a0 et
retourne le pointeur dans v0
11
Gestion de lallocation
En pratique, on alloue un gros tableau Tas (statiquement ou
dynamiquement) dans lequel on salloue des petits blocs.
Par exemple on r
eserve un registre pour pointer sur le premier
emplacement libre du tas.
start :
Slide 22
la
...
$t8, Tas
# on r
eserve le registre
t8
sw
add
add
j
$a0, ( $t8)
#
ecrit la taille dans l ent
ete
$v0, $t8, 4
# v0 < adresse de la case 0
$t8, $v0, $a0 # augmente t8 de la taille +1
$ra
array :
Le byte-code
Cest un jeu dintructions invent
e pour une machine virtuelle (ou
abstraite) qui est alors interpr
et
e par un programme, lui m
eme
compil
e dans lassembleur de la machine r
eelle.
Avantages : le byte-code est ind
ependant de larchitecture, il est
portable (fonctionne sur diff
erentes machines).
Slide 23
12
Exercices
Utilisation de SPIM en td Spim est install
e sur les machines de
la salle 33. Dans les autres salles, il faut
eventuellement se loger
`
a distance sur des machines de cette salle linux. (Voir les d
etails
dans le version HTML.)
La fonction de Fibonnaci
Slide 24
Slide 25
expression. mli
type expression =
| Binexp of binop expression expression
| Int of int
| X ( variable )
and binop = Plus | Minus | Times | Div;;
Pour
eviter les probl`
emes dentr
ee sortie, on
ecrira le programme
`
a compiler sous la forme dun fichier source. Par exemple, pour
13
Slide 26
open Expression;;
open Arithmetique;;
let e =
Binexp (Plus,
Binexp (Times, X, X),
Binexp (Minus,
Int 1,
Binexp (Times, X, Int 2)))
in compile e;;
On fabriquera un ex
ecutable arith.out par la commande :
ocamlc o arith.out expression . mli arithmetique. ml arith . ml
puis le fichier de code Spim compil
e en lan
cant cette commande
./ arith . out > arith . spi
Le programme compil
e arith.spi devra
etre ex
ecutable sur la
machine SPIM par la commande :
spim notrap file arith . spi
standard,
evalue lexpression, et ainsi de suite tant que lentier lu
est non nul.
Slide 27
14
Slide 28
15