Changes between Version 64 and Version 65 of Archi-1-TP9
- Timestamp:
- Dec 4, 2020, 7:01:02 AM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v64 v65 178 178 ''''''''''''''' 179 179 }}} 180 1. A quoi sert la directive `.globl label` ? 181 {{{#!protected ------------------------------------------------------------------------------------ 182 ''''''''''''''' 183 * `globl` signifie `glob`al `l`abel. Cette directive permet de dire que le `label` est visible en dehors de son fichier de définition. Ainsi il est utilisable dans d'autres programme assembleur ou d'autres programmes C. 184 ''''''''''''''' 185 }}} 180 186 1. Ecrivez 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. 181 187 {{{#!protected ------------------------------------------------------------------------------------ … … 203 209 {{{#!asm 204 210 la $29, __kdata_end 205 }}} 211 }}} 206 212 ''''''''''''''' 207 213 }}} … … 215 221 **Questions 216 222 217 1. Pourquoi déclarer des fonctions ou des variables `extern` ? Quel est l'équivalent en assembleur ? 218 1. Quels sont les rôles du mot clés `static` en C ? (il y en a 3 à ma connaissance) 223 1. Quels sont les usages du mot clé `static` en C ? 224 {{{#!protected ------------------------------------------------------------------------------------ 225 ''''''''''''''' 226 1. Déclarer `static` une variable globale ou une fonction en faisant précéder leur définition du mot clé `static` permet de limiter la visibilité de cette variable ou de cette fonction au seul fichier de déclaration. Noter que par défaut les variable et les fonctions du C ne sont pas `static`, il faut le demander explicitement. C'est exactement l'inverse en assembleur où tous les labels sont static et il faut demander avec `.globl` pour le rendre visible. 227 1. Déclarer `static` une variable locale permet de la rendre persistante, c'est-à-dire qu'elle conserve sa valeur entre deux appels. Cette variable locale n'est pas dans le contexte de la fonction (celui-ci est dans la pile et il est libéré en sortie de fonction). Une variable locale statique est en fait une variable globale dont l'usage est limité à la seule fonction où elle est définie. 228 ''''''''''''''' 229 }}} 230 1. Pourquoi déclarer des fonctions ou des variables `extern` ? 231 {{{#!protected ------------------------------------------------------------------------------------ 232 ''''''''''''''' 233 * Les déclarations `extern` permettent d'informer que le compilateur qu'une variable ou qu'une fonction définie ailleurs existe. Le compilateur est ainsi informé du type de la variable ou du prototype des fonctions, il sait donc comment les utiliser. En C par défaut les variables et les fonctions 234 * Il n'y a pas de déclaration extern en assembleur par ce n'est pas un langage typé. Pour l'assembleur, un label c'est juste un nombre. 235 ''''''''''''''' 236 }}} 219 237 1. Comment déclarer un tableau de structure en variable globale ? 238 {{{#!protected ------------------------------------------------------------------------------------ 239 ''''''''''''''' 240 * 241 ''''''''''''''' 242 }}} 220 243 1. Quelle est la différence entre `#include "file.h"` et `#include <file.h>"` ? 244 {{{#!protected ------------------------------------------------------------------------------------ 245 ''''''''''''''' 246 * 247 ''''''''''''''' 248 }}} 221 249 1. Comment définir une macro instruction du processeur uniquement si elle n'est pas définie ? 250 {{{#!protected ------------------------------------------------------------------------------------ 251 ''''''''''''''' 252 * 253 ''''''''''''''' 254 }}} 222 255 1. Comment être certain de ne pas inclure plusieurs fois le même fichier `.h` ? 223 1. Supposons que la structure `tty_s` est définie comme suit et les registres du `TTY0` sont accessible par la variable `struct tty_s __tty_regs_map[]`. Ecrivez une fonction C bloquante qui attend un caractère tapé au clavier. Nous vous rappelons qu'il faut attendre que le registre `TTY_STATUS` soit différent de 0 avant de lire `TTY_READ`. 224 1. Le fichier « ldscript » décrit l'espace d'adressage et la manière de remplir les sections dans le programme exectutable. 256 {{{#!protected ------------------------------------------------------------------------------------ 257 ''''''''''''''' 258 * 259 ''''''''''''''' 260 }}} 261 1. Supposons que la structure `tty_s` est définie comme suit et les registres du `TTY0` sont accessibles par la variable `struct tty_s __tty_regs_map[]`. Écrivez une fonction C bloquante qui attend un caractère tapé au clavier. Nous vous rappelons qu'il faut attendre que le registre `TTY_STATUS` soit différent de 0 avant de lire `TTY_READ`. 262 {{{#!protected ------------------------------------------------------------------------------------ 263 ''''''''''''''' 264 * 265 ''''''''''''''' 266 }}} 225 267 226 268 == A3. Chaîne de compilation 227 269 270 271 1. Le fichier « ldscript » décrit l'espace d'adressage et la manière de remplir les sections dans le programme exectutable. Quelle étape dans la chaîne de compilation a besoin de cette description ? 272 Les variables déclarées externes ne sont évidemment pas mise dans la section `.data` du fichier objet en sortie et les appel au fonction sont codés par des `jal ?` puisque le code des fonctions n'est pas là. Ce sera ré 228 273 229 274