Séquenceur CKCK n BASCULES Opcode Opérandes n BASCULES Opcode Opérandes Fanions RAM Contrôle SLC...
of 30/30
Séquenceur CK n BASCULES Opcode Opérandes Fanions RAM C o n t r ô l e SLC O p é r a n d e s Instruction Adresse CK Résumé CK Offset SLC Opcode Condition Fanions +1 Adresse + PC
Text of Séquenceur CKCK n BASCULES Opcode Opérandes n BASCULES Opcode Opérandes Fanions RAM Contrôle SLC...
Page 1
Squenceur CKCK n BASCULES Opcode Oprandes n BASCULES Opcode
Oprandes Fanions RAM Contrle SLC Oprandes Instruction Adresse CKCK
Rsum CKCK Offset SLC Opcode Condition Fanions +1 Adresse + PC
Page 2
Rsum Mmoire Squenceur CKCK IR Opcode Oprandes IR Opcode
Oprandes Fanions RAM Contrle SLC Oprandes MD R MA R CKCK PC PC +
PC+ offset PC + PC+ offset PC + adresse initiale MAR PC + MDR
M[MAR] IR + MDR MAR PC + MDR M[MAR] IR + MDR dcodification de IR PC
+ PC+1 saut? contrle? adresse? excution chargement OUI NONOUI
NONOUINON CK
Page 3
Procdures Lors de l'appel une procdure, l'unit de contrle doit
effectuer les oprations suivantes: Placer les paramtres l o la
procdure peut les rcuprer Transfrer le contrle la procdure Rserver
l'espace mmoire demand par la procdure (sauvegarder les valeurs des
registres) Excuter la procdure Placer le rsultat l o le caller (le
programme qui a appel la procdure) peut le rcuprer Transfrer le
contrle au caller
Page 4
Appel de procdure Une procdure est appele par une seule et
unique instruction (p.ex. jal Adresse dans MIPS). Les registres
sont l'endroit le plus efficace pour stocker les paramtres et les
rsultats d'une procdure. Certaines architectures (p.ex. MIPS)
rservent des registres pour cela (p.ex. l'architecture MIPS rserve
$a0-$a3 pour les paramtres et $v0-$v1 pour les rsultats). Lors de
l'appel d'une procdure, le caller doit stocker les paramtres dans
les registres appropris, o la procdure pourra les rcuprer. De la
mme faon, la procdure doit stocker les rsultats dans les registres
ddis avant de terminer et transfrer le contrle au caller.
Page 5
Appel de procdure Le retour d'une procdure est galement effectu
par une seule et unique instruction (p.ex. jr $ra dans MIPS). Lors
de l'appel d'une procdure, le caller doit lui fournir un adresse de
retour (correspondant l'adresse de l'instruction excuter une fois
la procdure termine). Lors d'un appel de procdure, il est donc
ncessaire de stocker aussi cette adresse de retour. Cette adresse
peut galement tre stocke dans un registre (p.ex. MIPS stocke cette
adresse dans un registre ddi, $ra ). Cette adresse est normalement
l'adresse de l'instruction suivante l'appel de procdure.
Page 6
Appel de procdure - Exemple I Supposons qu'un programme appelle
la procdure suivante: int P1 (int g, int h) { int f; f = g + h;
return f; } Et qu'il a stock g dans $a0 et h dans $a1. Si $ra
contient l'adresse de retour, le code compil pour cette procdure
est (ou plutt, pourrait tre): P1:add $a0,$a1,$v0{$v0 rsultat} jr
$ra{retour}
Page 7
Appel de procdure - Exemple II Lors d'un retour de procdure,
les registres doivent contenir les mmes valeurs qu'ils avaient
avant l'appel de la procdure. Cette obligation peut causer des
problmes quand la procdure doit stocker des valeurs intermdiaires
(et a donc besoin des registres). Par exemple: int P2 (int g, int
h, int i, int j) { int f; f = (g + h) - (i + j); return f; }
Page 8
Appel de procdure - Le stack Il est donc ncessaire de
sauvegarder l'tat de ces registres lors d'un appel une procdure.
Cette opration est effectue l'aide d'une pile ou stack. Une portion
de la mmoire principale est rserve pour stocker toute information
ncessaire aux appels de procdure. Chaque processeur contient un
registre (le stack pointer ou SP ) qui stocke l'adresse du dernier
mot de cette pile. Lors de l'appel d'une procdure, le contenu des
registres qui vont tre "crass" par la procdure est sauvegard dans
le stack.
Page 9
Appel de procdure - Exemple II int P2 (int g, int h, int i, int
j) { int f; f = (g + h) - (i + j); return f; } Pour cet exemple, on
suppose que $a0 contient g, $a1 contient h, $a2 contient i et $a3
contient j. P2:push $r0,+($sp){sauvegarde du contenu de r0 push
$r1,+($sp) { et r1; sp pr-incrment} add $a0,$a1,$r0 add $a2,$a3,$r1
sub $r0,$r1,$v0{$v0 rsultat} pop ($sp)-,$r1{restauration de r0 et
r1; pop ($sp)-,$r0{ sp post-dcrment} jr $ra{retour}
Page 10
Appel de procdure - Le stack $SP $R1 $SP $R0
AvantPendantAprs
Page 11
Le stack Le stack peut aussi tre utilis pour stocker des
paramtres (dans le cas du MIPS, s'il y a plus que 4 paramtres). Ces
paramtres peuvent tre stocks soit directement (valeur) soit
indirectement (adresse). $SP Sauvegarde $SP Paramtres
AvantPendantAprs
Page 12
Procdures imbriques et rcursives Lors d'un appel de procdure
imbriqu (ou lors d'une procdure rcursive), il faut aussi
sauvegarder: l'adresse de retour de la premire procdure; les
paramtres passs la premire procdure, s'ils sont passs en utilisant
des registres (p.ex. a0-a3 dans le MIPS). Par exemple: int P3 (int
n) { if (n
Appel de procdure - Exemple III Pour cet exemple, on suppose
que $a0 contient n. P3:push $ra,+($sp){sauvegarde de l'adresse de
push $a0,+($sp) { retour et du paramtre} bgt $a0,#1,L1{saut sur L1
si n>1} move #1,$v0{$v0 rsultat} sub $sp,#2,$sp{le sp est
dcrment} jr $ra{retour} L1:sub $a0,$a0,#1{le paramtre est dcrment}
jal P3{appel rcursif} pop ($sp)-,$a0{restauration de l'adresse de
pop ($sp)-,$ra{ retour et du paramtre} mult $v0,$a0,$v0{$v0
rsultat} jr $ra{retour}