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

Séquenceur CKCK n BASCULES Opcode Opérandes n BASCULES Opcode Opérandes Fanions RAM Contrôle SLC Opérandes Instruction Adresse CKCK Résumé CKCK Offset

Embed Size (px)

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}