Changes between Version 144 and Version 145 of Archi-1-TP9
- Timestamp:
- Nov 21, 2021, 8:43:24 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v144 v145 143 143 {{{#!protected ------------------------------------------------------------------------------------ 144 144 '' 145 Cours 9 / slide 10\\\\ 145 146 Ce qu'il faut bien comprendre, c'est que l'adresse du registre TTY_WRITE est l'adresse d'une __sortie du SoC__, ce n'est pas une mémoire à proprement parler. Il est d'ailleurs interdit de lire à cette adresse. Pour écrire un message à l'écran, il faut écrire tous les caractères du message à cette adresse (0xD0200000). En principe, entre chaque écriture, il faut attendre un peu que le caractère précédent soit parti, parce que le débit du port de sortie matériel (USB par exemple) est beaucoup plus lent que ce que peut faire le processeur. Dans notre cas, c'est un simulateur de SoC et les caractères sont envoyés vers un terminal sans délai. Dans ce cas, il n'est pas nécessaire d'attendre. 146 147 {{{#!asm … … 166 167 Réécrivez le code de la question précédente en utilisant `la` et `li` 167 168 {{{#!protected ------------------------------------------------------------------------------------ 168 ''''''''''''''' 169 '' 170 Cours 9 / slide 19 169 171 {{{#!asm 170 172 la $4, __tty_regs_map … … 172 174 sb $5, 0($4) 173 175 }}} 174 '' '''''''''''''176 '' 175 177 }}} 176 178 1. En assembleur pour sauter à une adresse de manière inconditionnelle, on utilise les instructions `j label` et `jr $r`. Ces instructions permettent-elles d'effectuer un saut à n'importe quelle adresse ? 177 179 {{{#!protected ------------------------------------------------------------------------------------ 178 ''''''''''''''' 179 * 180 - `j label` malgré sa forme assembleur effectue un saut relativement au `PC` puisque le `label` n'est pas entièrement encodé dans l'instruction binaire (cf. cours sur les sauts). Cette instruction réalise : `PC ← (PC & 0xF0000000) | (ZeroExtend(label, 32) << 2)`. Les 4 bits de poids forts du `PC` sont conservés, le saut est bien relatif au PC (ZeroExtend désigne ici le fait d'étendre le label sur 32 bits en ajoutant des zéros en tête, à changer s'il y a une meilleure syntaxe). 181 - A l'inverse, `jr $r` effectue un saut absolu puisque cette instruction réalise `PC ← $r` 182 Autrement dit, si l’on veut aller exécuter du code n'importe où en mémoire, il faut utiliser `jr`. 183 ''''''''''''''' 180 '' 181 La réponse n'est pas dans le cours, mais dans la connaissance du codage des instructions de saut (**`j`**ump et **`b`**ranch). Il faut avoir compris que l'instruction **`j`** et toutes les branchements (**`bne`**, **`beq`**, etc.) sont relatives au PC. Il n'est pas possible d'aller n'importe où dans l'espace d'adressage. 182 * `j label` malgré sa forme assembleur effectue un saut relativement au **`PC`** puisque le **`label`** n'est pas entièrement encodé dans l'instruction binaire (cf. cours sur les sauts). Cette instruction réalise :\\**`PC ← (PC & 0xF0000000) | (ZeroExtended(label, 32) << 2)`**\\Les 4 bits de poids forts du **`PC`** sont conservés, le saut est bien relatif au PC\\(`ZeroExtended` désigne ici le fait d'étendre le label sur 32 bits en ajoutant des zéros en tête).\\ Autrement dit, si **`j label`** est à l'adresse **`PC`**, l'adresse **`label`** doit avoir le même chiffre de poids fort (en hexa décimal), c'est-à-dire les mêmes 4 bits de poids fort en binaire). Sinon l'assembleur provoque une erreur lors du codage. 183 * A l'inverse, **`jr $r`** effectue un saut absolu puisque cette instruction réalise **`PC ← $r`** 184 185 Autrement dit, si l’on veut aller exécuter du code n'importe où en mémoire, il faut utiliser **`jr`**. 186 '' 184 187 }}} 185 188 1. Vous avez utilisé les directives `.text` et `.data` pour définir les sections où placer les instructions et les variables globales, mais il existe la possibilité de demander la création d'une nouvelle section dans le code objet produit par le compilateur avec la directive `.section name,"flags"`