142 | | 1. Un problème avec le code précédent 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. Il est préférable d'utiliser une étiquette pour désigner cette adresse : on suppose désormais que l'adresse du premier registre du `TTY` se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, mais il ne connaît que le symbole. |
143 | | |
144 | | Pour écrire `'x'` sur le terminal 0, nous pouvons utiliser la macro `la $r, label`. Cette macro instruction est remplacée lors de l'assemblage du code par une suite composée de deux instructions `lui` et `ori`. Il existe aussi la macro instruction `li` qui demande de charger une valeur sur 32 bits dans un registre. Pour être plus précis, les macro-instructions |
| 142 | 1. Un problème avec le code précédent 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. Il est préférable d'utiliser une étiquette pour désigner cette adresse : on suppose désormais que l'adresse du premier registre du `TTY` se nomme `__tty_regs_map`. Le code assembleur ne connait pas l'adresse, mais il ne connaît que le symbole. Ainsi, pour écrire `'x'` sur le terminal 0, nous devons utiliser la macro instruction `la $r, label`. Cette macro-instruction est remplacée lors de l'assemblage du code par une suite composée de deux instructions `lui` et `ori`. Il existe aussi la macro instruction `li` qui demande de charger une valeur sur 32 bits dans un registre. Pour être plus précis, les macro-instructions |
166 | | 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 ? |
167 | | {{{#!protected ------------------------------------------------------------------------------------ |
168 | | ''''''''''''''' |
169 | | * Presque, mais pas tout à fait |
170 | | - `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. |
171 | | - `jr $r` effectue un vrai saut absolu puisqu’elle fait `PC ← $r` |
172 | | Autrement dit, si l’on veut aller n'importe où en mémoire, il faut utiliser `jr`. |
| 164 | 1. En assembleur pour sauter à une adresse de manière inconditionnelle, on utilise les instructions `j label` et `jr $r`. Ces instructions permettent dd'effeectuer un saut à n'importe quelle adresse ? |
| 165 | {{{#!protected ------------------------------------------------------------------------------------ |
| 166 | ''''''''''''''' |
| 167 | * |
| 168 | - `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 + (label<<2)&0x0FFFFFFF)`. Les 4 bits de poids forts du `PC` sont conservés, le saut est bien relatif au PC. |
| 169 | - A l'inverse, `jr $r` effectue un saut absolu puisque cette instruction réalise `PC ← $r` |
| 170 | Autrement dit, si l’on veut aller exécuter du code n'importe où en mémoire, il faut utiliser `jr`. |