Changes between Version 152 and Version 153 of Archi-1-TP9
- Timestamp:
- Nov 21, 2021, 11:22:26 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v152 v153 143 143 {{{#!protected ------------------------------------------------------------------------------------ 144 144 '' 145 Cours 9 / slide 10\\\\ 145 Cours 9 / slide 10 146 146 147 Ce qu'il faut bien comprendre, c'est que l'adresse du registre TTY_WRITE est l'adresse d'une __sortie du SoC__, ce n'est pas une mémoire à proprement parler. Il est d'ailleurs interdit de lire à cette adresse. Pour écrire un message à l'écran, il faut écrire tous les caractères du message à cette adresse (0xD0200000). En principe, entre chaque écriture, il faut attendre un peu que le caractère précédent soit parti, parce que le débit du port de sortie matériel (USB par exemple) est beaucoup plus lent que ce que peut faire le processeur. Dans notre cas, c'est un simulateur de SoC et les caractères sont envoyés vers un terminal sans délai. Dans ce cas, il n'est pas nécessaire d'attendre. 147 148 {{{#!asm … … 168 169 {{{#!protected ------------------------------------------------------------------------------------ 169 170 '' 170 Cours 9 / slide 19\\\\ 171 Cours 9 / slide 19 172 171 173 Il suffit de remplacer les instructions `lui` et `ori` par `la` et `li`. 172 174 {{{#!asm … … 193 195 {{{#!protected ------------------------------------------------------------------------------------ 194 196 '' 195 Cours 9 / slide 19\\\\ 197 Cours 9 / slide 19 198 196 199 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`). 197 200 {{{#!as … … 204 207 {{{#!protected ------------------------------------------------------------------------------------ 205 208 '' 206 Cours 9 / slide 19\\\\ 209 Cours 9 / slide 19 210 207 211 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`. 208 212 * `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. … … 259 263 1. Pourquoi déclarer des fonctions ou des variables `extern` ? 260 264 {{{#!protected ------------------------------------------------------------------------------------ 261 ''''''''''''''' 265 '' 266 Ça n'ont plus ce n'est pas dit dans le cours mais c'est sensé être connu, sinon c'est qu'il y a des choses à apprendre. Notez que la directive externe est implicite en C et qu'on peut donc ne pas l'écrire. On la met pour la lisibilité du code. 262 267 * Les déclarations `extern` permettent d'informer que le compilateur qu'une variable ou qu'une fonction existe et est définie ailleurs. Le compilateur connaît ainsi le 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 doivent être déclarées / leur existence et type doit être connus avant leur utilisation. 263 268 * Il n'y a pas de déclaration `extern` en assembleur parce que ce n'est pas un langage typé. Pour l'assembleur, un label c'est juste une adresse donc un nombre. 264 '' '''''''''''''269 '' 265 270 }}} 266 271 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` et a 2 cases. 267 272 {{{#!protected ------------------------------------------------------------------------------------ 268 ''''''''''''''' 273 '' 274 Là encore, ce sont des connaissances censées être connues, mais c'est important parce qu'on a besoin de le comprendre pour la déclaration des registres du TTY. 269 275 {{{#!c 270 276 struct test_s { … … 274 280 struct test_s tab[2]; 275 281 }}} 276 ''''''''''''''' 277 }}} 278 1. Quelle est la différence entre `#include "file.h"` et `#include <file.h>` ? 279 {{{#!protected ------------------------------------------------------------------------------------ 280 ''''''''''''''' 282 '' 283 }}} 284 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 ? 285 {{{#!protected ------------------------------------------------------------------------------------ 286 '' 287 Cours 9 / slide 18 et 58 288 289 Ce sont toujours des connaissances connues en principe, mais comme c'est utilisé dans le code, ce n'est pas inutile d'en parler rapidement. 281 290 * Avec `#include "file.h"`, le préprocesseur recherche le fichier dans le répertoire local. 282 291 * Avec `#include <file.h>`, le préprocesseur recherche le fichier dans les répertoires standards tel que `/usr/include` et dans les répertoires spécifiés par l'option `-I` du préprocesseur. Il peut y avoir plusieurs fois `-I` dans la commande, par exemple `-Idir1 -Idir2 -Idir3`. 283 ''''''''''''''' 292 * C'est donc l'option `-I` qui permet de définir les répertoires de recherche. 293 '' 284 294 }}} 285 295 1. Comment définir une macro-instruction C uniquement si elle n'est pas déjà définie ? Écrivez un exemple.