Changes between Version 57 and Version 58 of Archi-1-TP9
- Timestamp:
- Dec 4, 2020, 3:43:47 AM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v57 v58 133 133 ''''''''''''''' 134 134 }}} 135 1. Le problème est que l'adresse du `TTY` est un choix de l'architecte du prototype et s'il décide de placer le `TTY` ailleurs dans l'espace d'adressage, il faudra réécrire le code précédent. Nous allons utiliser une étiquette, supposons que l'adresse du premier registre du `TTY` se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, il ne conna it que le symbole. Si nous voulons toujours écrire `'x'` sur le terminal 0. Nous allons utiliser la macro `la $r, label` qui est remplacée par les deux instructions `lui` et `ori`. Pour être plus précis135 1. Le problème est que l'adresse du `TTY` est un choix de l'architecte du prototype et s'il décide de placer le `TTY` ailleurs dans l'espace d'adressage, il faudra réécrire le code précédent. Nous allons utiliser une étiquette, supposons que l'adresse du premier registre du `TTY` se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, il ne connaît que le symbole. Si nous voulons toujours écrire `'x'` sur le terminal 0. Nous allons utiliser la macro `la $r, label` qui est remplacée par les deux instructions `lui` et `ori`. Il existe aussi la macro `li` pour initialiser des valeurs 32bits dans un registre. Pour être plus précis, les instructions 136 136 {{{#!asm 137 137 la $r, label 138 li $r, 0x87654321 138 139 }}} 139 est remplacépar140 sont remplacés par 140 141 {{{#!asm 141 142 lui $r, label>>16 142 143 ori $r, $r, label & 0xFFFF 143 }}} 144 Réécrivez le code précédent en utilisant `la` 144 lui $r, 0x8765 145 ori $r, $r, 0x4321 146 }}} 147 Réécrivez le code de la question précédente en utilisant `la` et `li` 145 148 {{{#!protected ------------------------------------------------------------------------------------ 146 149 ''''''''''''''' 147 150 {{{#!asm 148 151 la $4, __tty_regs_map 149 ori$5, 'x'152 li $5, 'x' 150 153 sb $5, ($4) 151 154 }}} 152 155 ''''''''''''''' 153 156 }}} 157 1. En assembleur pour sauter à une adresse de manière inconditionnelle, on utilise les instructions `j label` ou `jr $r`, peuvent-elles faire les choses ? 158 {{{#!protected ------------------------------------------------------------------------------------ 159 ''''''''''''''' 160 * Presque, mais pas tout à fait 161 - `j label` effectue en fait un saut relatif au `PC` puisqu’elle fait `PC ← PC&0xF0000000 + (label<<2)&0x0FFFFFFF)`. Les 4 bits de poids forts du `PC` sont conservés. 162 - `jr $r` effectue un vrai saut absolu puisqu’elle fait `PC ← $r` 163 Autrement dit, si l’on veut aller n'importe où en mémoire, il faut utiliser `jr`. 164 ''''''''''''''' 165 }}} 166 1. Vous avez utilisé les directives `.text` et `.data` pour définir la section où placer les instructions et les v ? 167 {{{#!protected ------------------------------------------------------------------------------------ 168 ''''''''''''''' 169 * 170 ''''''''''''''' 171 }}} 172 173 174 154 175 == A3. Chaîne de compilation 155 176 … … 465 486 466 487 467 468 488 == 5. Premier petit pilote pour le terminal 469 489