Changes between Version 64 and Version 65 of Archi-1-TP9


Ignore:
Timestamp:
Dec 4, 2020, 7:01:02 AM (4 years ago)
Author:
franck
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v64 v65  
    178178'''''''''''''''
    179179}}}
     1801. 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}}}
    1801861. 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.
    181187{{{#!protected ------------------------------------------------------------------------------------
     
    203209{{{#!asm
    204210 la  $29, __kdata_end
    205 }}}
     211}}}  
    206212'''''''''''''''
    207213}}}
     
    215221**Questions
    216222
    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)
     2231. Quels sont les usages du mot clé `static` en C ?
     224{{{#!protected ------------------------------------------------------------------------------------
     225'''''''''''''''
     2261. 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.
     2271. 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}}}
     2301. 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}}}
    2192371. Comment déclarer un tableau de structure en variable globale ?
     238{{{#!protected ------------------------------------------------------------------------------------
     239'''''''''''''''
     240*
     241'''''''''''''''
     242}}}
    2202431. Quelle est la différence entre `#include "file.h"` et `#include <file.h>"` ?
     244{{{#!protected ------------------------------------------------------------------------------------
     245'''''''''''''''
     246*
     247'''''''''''''''
     248}}}
    2212491. Comment définir une macro instruction du processeur uniquement si elle n'est pas définie ?
     250{{{#!protected ------------------------------------------------------------------------------------
     251'''''''''''''''
     252*
     253'''''''''''''''
     254}}}
    2222551. 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}}}
     2611. 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}}}
    225267
    226268== A3. Chaîne de compilation
    227269
     270
     2711. 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é
    228273
    229274