Changes between Version 6 and Version 7 of Archi-1-TD9
- Timestamp:
- Jan 14, 2022, 2:56:44 PM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TD9
v6 v7 140 140 {{{#!protected ------------------------------------------------------------------------------------ 141 141 '' 142 Cours 9 / slide 1 9\\\\142 Cours 9 / slide 18\\\\ 143 143 Il suffit de remplacer les instructions `lui` et `ori` par `la` et `li`. 144 144 {{{#!asm … … 165 165 {{{#!protected ------------------------------------------------------------------------------------ 166 166 '' 167 Cours 9 / slide 1 9\\\\167 Cours 9 / slide 18\\\\ 168 168 Pour répondre, il faut avoir compris l'explication donnée dans la question. L'intérêt de cette question est de revenir sur la notion de section. Une section est un segment d'adresses ayant un but spécifique. On définit des segments d'adresses pour le code, pour les données (il y a d'ailleurs plusieurs types de sections en fonction du type de données). Ces segments sont placés dans l'espace d'adressage par l'éditeur de liens (`ld`) et la manière dont ils sont placés est définie dans un fichier donné en paramètre de l'éditeur de lien, ce fichier de description de placement est le `ldscript`). 169 169 {{{#!as … … 176 176 {{{#!protected ------------------------------------------------------------------------------------ 177 177 '' 178 Cours 9 / slide 1 9\\\\178 Cours 9 / slide 18\\\\ 179 179 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`. 180 180 * `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 les autres fichiers assembleur ou les autres fichier C du programme. … … 255 255 '' 256 256 }}} 257 {{{#!comment 257 258 1. Quelle est la différence entre `#include "file.h"` et `#include <file.h>` ? Quelle option du compilateur C permet de spécifier les répertoires lesquels se trouvent les fichiers include ? 258 259 {{{#!protected ------------------------------------------------------------------------------------ … … 295 296 }}} 296 297 '' 298 }}} 297 299 }}} 298 300 1. Supposons que la structure `tty_s` et le tableau de registres de `TTY` soient définis comme suit. Écrivez une fonction C `int getchar(void)` bloquante qui attend un caractère tapé au clavier sur le `TTY0`. Nous vous rappelons qu'il faut attendre que le registre `TTY_STATUS` soit différent de 0 avant de lire `TTY_READ`. `NTTYS` est un `#define` définit dans le Makefile de compilation avec le nombre de terminaux du SoC (en utilisant l'option `-D` de gcc). … … 376 378 {{{#!protected ------------------------------------------------------------------------------------ 377 379 '' 378 Cours 9 / slides 2 3 et 24\\\\380 Cours 9 / slides 22 et 23\\\\ 379 381 Pour répondre, il faut savoir interpréter le dessin représentant l'espace d'adressage. Si ça semble difficile, il faut revoir ce qu'est l'espace d'adressage. 380 382 {{{#!c … … 397 399 {{{#!protected ------------------------------------------------------------------------------------ 398 400 '' 399 Cours 9 / slides 2 3 et 24\\\\401 Cours 9 / slides 22 et 23\\\\ 400 402 Il faut bien comprendre que `.ktext` est une section produite par l'éditeur de liens. C'est ce que l'on appelle une section de sortie. `.text` est une section que l'éditeur de liens trouve dans un fichier objet `.o`, c'est ce que l'on appelle une section d'entrée. Comme il y a plusieurs fichiers objet, on doit dire à l'éditeur de lien de prendre toutes les sections `.text` de tous les fichiers qu'on lui donne. Le `*` devant `(.text)` est une expression régulière permettant de dire à l'éditeur de liens quels fichiers sont concernés, ici avec `*` c'est tous les fichiers. Les expressions régulières sont celles qu'on utilise avec le `shell`. 401 403 {{{#!c … … 462 464 {{{#!protected ------------------------------------------------------------------------------------ 463 465 '' 464 Cours 9 / Slide 55\\\\466 Cours 9 / Slide 8 annexe\\\\ 465 467 Le compilateur C peut avoir beaucoup de paramètres. Définir une variable `CFLAGS` permet de les déclarer une fois au début et d'utiliser cette variable plusieurs fois dans le `Makefile`. Si on veut changer un argument, il suffit de le faire une seule fois. Ce genre de choses est nécessaire si on veut faire des `Makefile`s facile à lire et à faire évoluer. 466 468 * La variable `CFLAGS` est utilisée par `gcc`, il y a ici toutes les options indispensables pour compiler mais il en existe beaucoup, ce qui fait des tonnes de combinaison d'options ! … … 471 473 {{{#!protected ------------------------------------------------------------------------------------ 472 474 '' 473 Cours 9 / slides 28 et 29\\\\475 Cours 9 / slides 6 annexe\\\\ 474 476 Mettre une règle `help` comme règle par défaut permet de documenter l'usage du `Makefile`, ce qui est plutôt une bonne pratique quand il y a beaucoup de cible et de paramètres. C'est d'autant plus vrai qu'on utilise les Makefiles comme des ensembles de `shell script`. 475 477 * C'est la première cible qui est choisie, donc ici c'est équivalent à `make help`. Cela affiche l'usage pour connaître les cibles disponibles.