Changes between Version 152 and Version 153 of Archi-1-TP9


Ignore:
Timestamp:
Nov 21, 2021, 11:22:26 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v152 v153  
    143143{{{#!protected ------------------------------------------------------------------------------------
    144144''
    145 Cours 9 / slide 10\\\\
     145Cours 9 / slide 10
     146
    146147Ce 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.
    147148{{{#!asm
     
    168169{{{#!protected ------------------------------------------------------------------------------------
    169170''
    170 Cours 9 / slide 19\\\\
     171Cours 9 / slide 19
     172
    171173Il suffit de remplacer les instructions `lui` et `ori` par `la` et `li`.
    172174{{{#!asm
     
    193195{{{#!protected ------------------------------------------------------------------------------------
    194196''
    195 Cours 9 / slide 19\\\\
     197Cours 9 / slide 19
     198
    196199Pour 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`).
    197200{{{#!as
     
    204207{{{#!protected ------------------------------------------------------------------------------------
    205208''
    206 Cours 9 / slide 19\\\\
     209Cours 9 / slide 19
     210
    207211Ce 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`.
    208212* `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.
     
    2592631. Pourquoi déclarer des fonctions ou des variables `extern` ?
    260264{{{#!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.
    262267* 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.
    263268* 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''
    265270}}}
    2662711. 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.
    267272{{{#!protected ------------------------------------------------------------------------------------
    268 '''''''''''''''
     273''
     274Là 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.
    269275{{{#!c
    270276struct test_s {
     
    274280struct test_s tab[2];
    275281}}}
    276 '''''''''''''''
    277 }}}
    278 1. Quelle est la différence entre `#include "file.h"` et `#include <file.h>` ?
    279 {{{#!protected ------------------------------------------------------------------------------------
    280 '''''''''''''''
     282''
     283}}}
     2841. 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''
     287Cours 9 / slide 18 et 58
     288
     289Ce sont toujours des connaissances connues en principe, mais comme c'est utilisé dans le code, ce n'est pas inutile d'en parler rapidement.
    281290* Avec `#include "file.h"`, le préprocesseur recherche le fichier dans le répertoire local.
    282291* 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''
    284294}}}
    2852951. Comment définir une macro-instruction C uniquement si elle n'est pas déjà définie ? Écrivez un exemple.