89 | | 1. Que représentent les flèches bleues sur le schéma ? Pourquoi ne vont-elles que dans une seule direction ? (C9 S11) |
90 | | {{{#!protected ------------------------------------------------------------------------------------ |
91 | | '' |
92 | | * Ces flèches représentent les requêtes d'accès à la mémoire, c'est-à-dire les ''loads'' et les ''stores'' qui sont émis par le MIPS lors de l'exécution des instructions `lw`, `sw`, etc. Les requêtes sont émises par le MIPS et reçues par les composants mémoires ou périphériques. |
| 89 | 1. Que représentent les flèches bleues sur le schéma ci-dessus ? Pourquoi ne vont-elles que dans une seule direction ? (C9 S11) |
| 90 | {{{#!protected ------------------------------------------------------------------------------------ |
| 91 | '' |
| 92 | * Ces flèches représentent le sens des requêtes d'accès à la mémoire, c'est-à-dire les ''loads'' et les ''stores''. Ces requêtes sont émises par le MIPS lors de l'exécution des instructions `lw`, `sw`, etc. Les requêtes sont émises par le MIPS et reçues par les composants mémoires ou les périphériques. |
113 | | lui $4, 0xD020 |
114 | | ori $4, $4, 0x0000 // cette instruction ne sert a rien puisqu on ajoute 0, mais je la mets pour le cas general |
115 | | ori $5, $0, 'x' |
116 | | sb $5, 0($4) // Notez que l immediat 0 devant ($4) n est pas obligatoire mais on s obligera als le mettre |
| 113 | lui $4, 0xD020 // $4 <- 0xD0200000 |
| 114 | ori $5, $0, 'x' // $5 <- code ascii de x |
| 115 | sb $5, 0($4) // TTY0.TTY_WRITE <- x |
121 | | 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 |
| 120 | 1. Dans la question précédente, on connaissait l'adresse absolue du registre TTY_WRTIE. On suppose désormais que l'adresse du premier registre du `TTY` se nomme `__tty_regs_map`. Le programmeur ne connait pas l'adresse, 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 les 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 |
128 | | lui $r, label>>16 |
129 | | ori $r, $r, label & 0xFFFF |
130 | | lui $r, 0x8765 |
131 | | ori $r, $r, 0x4321 |
| 127 | lui $r, label>>16 // chargement des 16 bits de poids forts de label |
| 128 | ori $r, $r, label & 0xFFFF // chargement des 16 bits de poids faible de label |
| 129 | lui $r, 0x8765 // chargement des 16 bits de poids fort de 0x8765431 |
| 130 | ori $r, $r, 0x4321 // chargement des 16 bits de poids faible de 0x8765431 |
148 | | * `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. |
| 147 | * `j label` effectue un saut relativement au `PC` puisque le `label` n'est pas entièrement encodé dans l'instruction binaire.\\Cette instruction réalise :\\`PC ← (PC & 0xF0000000) + (ZeroExtended(IMD26, 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 l'instruction `j label` est à l'adresse `PC`, l'adresse `label` doit avoir le même chiffre de poids fort (en hexadécimal), c'est-à-dire les mêmes 4 bits de poids fort (b31 à b28) en binaire, sinon l'assembleur provoque une erreur lors du codage. |
167 | | 1. À quoi sert la directive `.globl label` ? (C9 S18) |
168 | | {{{#!protected ------------------------------------------------------------------------------------ |
169 | | '' |
170 | | * Ce qu'il faut comprendre, c'est que les comportements du `C` et de l'assembleur sont inversés vis-à-vis des labels. Dans un fichier `.c`, quand on définit un label (une fonction ou variable), ce label est par défaut `extern`, c'est-à-dire qu'il est utilisable dans un autre fichier `.c`. Si on veut que le label ne soit utilisable que dans le fichier dans lequel il est défini, il faut utiliser le mot clé `static` lors de sa déclaration. En assembleur, c'est l'inverse, les labels sont par défaut `static`, c'est-à-dire utilisable uniquement dans le fichier où ils sont définis. Si on veut qu'ils soient utilisables dans les autres fichiers, il faut le dire avec la directive `.globl`. |
| 165 | 1. À quoi sert la directive `.globl label` dans un programme assembleur ? (C9 S18) |
| 166 | {{{#!protected ------------------------------------------------------------------------------------ |
| 167 | '' |
172 | | '' |
173 | | }}} |
174 | | 1. Écrivez une séquence de code qui affiche la chaîne de caractère `"Hello"` sur `TTY0`. Ce n'est pas une fonction et vous pouvez utiliser tous les registres que vous voulez. Vous supposez que `__tty_regs_maps` est déjà défini. |
175 | | {{{#!protected ------------------------------------------------------------------------------------ |
176 | | '' |
177 | | * Il faut laisser le temps d'écrire ce programme. Si la notion de section est comprise, si les macros `li` et `la` sont comprises, si l'écriture d'une boucle en assembleur est comprise, si l'usage du registre `write` du TTY est compris, alors c'est très facile, et si on donne la correction trop vite alors même ceux qui n'ont pas tout compris vont trouver ça évident. |
178 | | * Si les étudiants ne démarrent pas alors on peut donner la section `.data` et l'initialisation des registres `$4` et `$5`. |
| 169 | * Ce qu'il faut comprendre, c'est que les comportements du `C` et de l'assembleur vis-à-vis des labels sont inversés. Dans un fichier `C`, quand on définit un label (une fonction ou variable), ce label est par défaut `extern`, c'est-à-dire qu'il est utilisable dans un autre fichier `C`. Si on veut que le label ne soit utilisable que dans le fichier dans lequel il est défini, il faut utiliser le mot clé `static` lors de sa déclaration. En assembleur, c'est l'inverse, les labels sont par défaut `static`, c'est-à-dire utilisable uniquement dans le fichier où ils sont définis. Si on veut qu'ils soient utilisables dans les autres fichiers, il faut le dire avec la directive `.globl`. |
| 170 | '' |
| 171 | }}} |
| 172 | 1. Écrivez une séquence de code qui affiche la chaîne de caractère `"Hello"` sur `TTY0`.\\Vous devez déclarer la chaine de caractère `"Hello"` dans la section `.data`, puis écrire le code dans la section `.text`. Vous pouvez utiliser tous les registres que vous voulez. Vous supposez que le label `__tty_regs_maps` est déjà défini et qu'il désigne le premier registre de commande du `TTY0` qui est `TTY_WRITE`.\\C'est une boucle qui écrit chaque caractère de la chaîne dans le registre TTY_WRITE du TTY0, jusqu'à trouver le `0` de fin de chaîne. |
| 173 | {{{#!protected ------------------------------------------------------------------------------------ |
| 174 | '' |
| 175 | * On pourrait choisir d'autres registres. |