Changes between Version 99 and Version 100 of Archi-1-TP9
- Timestamp:
- Dec 10, 2020, 11:05:32 PM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v99 v100 171 171 ''''''''''''''' 172 172 }}} 173 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 e nouvelles sectionsdans le code objet produit par le compilateur avec la directive `.section name,"flags"`174 - `name` est le nom de la nouvelle section on met souvent un `.name` pour montrer que c'est une section et175 - `"flags"` informe du contenu `"ax"` pour des instructions, `"ad"` pour des données (ceux que ça intéresse pourront regarder là [https://frama.link/20UzK0FP])176 Écrivez le code assembleur créant la section ".mytext"et suivi de l'addition des registres `$5` et `$6` dans `$4`173 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"` 174 - `name` est le nom de la nouvelle section. On met souvent un `.name` pour montrer que c'est une section et 175 - `"flags"` informe du contenu : `"ax"` pour des instructions, `"ad"` pour des données (ceux que ça intéresse pourront regarder là [https://frama.link/20UzK0FP]) 176 Écrivez le code assembleur créant la section `".mytext"` et suivi de l'addition des registres `$5` et `$6` dans `$4` 177 177 {{{#!protected ------------------------------------------------------------------------------------ 178 178 ''''''''''''''' … … 207 207 ''''''''''''''' 208 208 }}} 209 1. En regardant, le dessin de l'espace d'adressage du prototype **almo1**, à quelle adresse devra être initialisé le pointeur de pile pour le kernel. Rappelez pourquoi c'est indispensable de le définir avant d'appeler une fonction C et écrivez le code qui fait l'initialisation, en supposant que l'adresse du pointeur porte le nom `__kdata_end`209 1. En regardant, le dessin de l'espace d'adressage du prototype **almo1**, à quelle adresse devra être initialisé le pointeur de pile pour le kernel. Rappelez pourquoi c'est indispensable de le définir avant d'appeler une fonction C et écrivez le code qui fait l'initialisation, en supposant que l'adresse du pointeur de pile vaut celle que représente le nom `__kdata_end` 210 210 {{{#!protected ------------------------------------------------------------------------------------ 211 211 ''''''''''''''' … … 229 229 {{{#!protected ------------------------------------------------------------------------------------ 230 230 ''''''''''''''' 231 1. Déclarer `static` une variable globale ou une fonction en faisant précéder leur définition du mot clé `static` permet s de limiter la visibilité de cette variable ou de cette fonction au seul fichier de déclaration. Notez que par défaut les variables 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` pourle rendre visible.232 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.231 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. Notez que par défaut les variables et les fonctions du C ne sont pas `static`, il faut le demander explicitement. C'est exactement l'inverse en assembleur où tout label est `static` et il faut demander avec la directive `.globl` de le rendre visible. 232 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 `static` est en fait allouée comme une variable globale mais son usage est limité à la seule fonction où elle est définie. 233 233 ''''''''''''''' 234 234 }}} … … 237 237 ''''''''''''''' 238 238 * 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 239 * 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 justeun nombre.240 ''''''''''''''' 241 }}} 242 1. Comment déclarer un tableau de structures en variable globale ? La structure est nommée `test_s` a deux champs `int` nommés `a` et `b`. Le tableau est nommé `tab` a 2 cases.239 * 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 une adresse donc un nombre. 240 ''''''''''''''' 241 }}} 242 1. Comment déclarer un tableau de structures en variable globale ? La structure est nommée `test_s`, elle a deux champs `int` nommés `a` et `b`. Le tableau est nommé `tab` a 2 cases. 243 243 {{{#!protected ------------------------------------------------------------------------------------ 244 244 ''''''''''''''' … … 259 259 ''''''''''''''' 260 260 }}} 261 1. Comment définir une macro instruction du processeur uniquement si elle n'est pasdéfinie ? Écrivez un exemple.261 1. Comment définir une macro-instruction C uniquement si elle n'est pas déjà définie ? Écrivez un exemple. 262 262 {{{#!protected ------------------------------------------------------------------------------------ 263 263 ''''''''''''''' … … 273 273 {{{#!protected ------------------------------------------------------------------------------------ 274 274 ''''''''''''''' 275 * En utilisant ce que nous venons de voir dans la question précédente . Si vous définissez une macro différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collisions de nom) et que vous nous commencer tester que cette variable n'est pas définie comme condition d'inclusion.275 * En utilisant ce que nous venons de voir dans la question précédente : il peut définir une macro instruction différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collisions de nom). On peut alors tester l'existence de cette macro comme condition d'inclusion du fichier. 276 276 {{{#!c 277 277 ————————————————————— début du fichier filename.h … … 311 311 ''''''''''''''' 312 312 * `volatile` permet de dire à `gcc` que la variable en mémoire peut changer à tout moment, elle est volatile. Ainsi quand le programme demande de lire une variable `volatile` le compilateur doit toujours aller la lire en mémoire. Il ne doit jamais chercher à optimiser en utilisant un registre afin de réduire le nombre de lecture mémoire (load). De même, quand le programme écrit dans une variable `volatile`, cela doit toujours provoquer une écriture dans la mémoire (store). 313 * Ainsi, les registres de périphériques doivent toujours être directement lus ou écrits à chaque fois que le programme le demande, parce que c'est justement ces lectures et ces écritures qui commandent le périphérique.313 * Ainsi, les registres de périphériques doivent toujours être impérativement lus ou écrits à chaque fois que le programme le demande, parce que c'est justement ces lectures et ces écritures qui commandent le périphérique. 314 314 ''''''''''''''' 315 315 }}} … … 358 358 }}} 359 359 360 1. Le fichier commence par la déclaration des variables donnant des informations sur les adresses et les tailles des régions de mémoire. Ces symboles n'ont pas de type et ils sont visibles de tous les programmes c, il faut juste leur donner un type pourle compilateur puisse les exploiter, c'est ce que nous avons fait pour `extern volatile struct tty_s __tty_regs_map[NTTYS]`. En regardant, dans le dessin de la représentation de l'espace d'adressage, complétez les lignes de déclaration des variables pour la région `kdata_region`360 1. Le fichier commence par la déclaration des variables donnant des informations sur les adresses et les tailles des régions de mémoire. Ces symboles n'ont pas de type et ils sont visibles de tous les programmes C, il faut juste leur donner un type pour que le compilateur puisse les exploiter, c'est ce que nous avons fait pour `extern volatile struct tty_s __tty_regs_map[NTTYS]`. En regardant, dans le dessin de la représentation de l'espace d'adressage, complétez les lignes de déclaration des variables pour la région `kdata_region` 361 361 {{{#!protected ------------------------------------------------------------------------------------ 362 362 ''''''''''''''' … … 367 367 ''''''''''''''' 368 368 }}} 369 1. Le fichier contient ensuite la déclaration des régions qui vont être remplies par les sections trouvées dans les fichiers objets. Complétez les lignes propres à la déclaration de la région `kdata_region`.369 1. Le fichier contient ensuite la déclaration des régions (dans `MEMORY{...}`) qui vont être remplies par les sections trouvées dans les fichiers objets. Comment modifiez cette partie (la zone `[... question 2 ...]`) pour ajouter les lignes correspondant à la déclaration de la région `kdata_region` ? 370 370 {{{#!protected ------------------------------------------------------------------------------------ 371 371 '''''''''''''''