Changes between Version 61 and Version 62 of Archi-1-TP9


Ignore:
Timestamp:
Dec 4, 2020, 5:20:44 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v61 v62  
    5959
    6060**Questions**
     61
    6162{{{#!protected ------------------------------------------------------------------------------------
    6263''Les réponses sont dans les transparents du cours
     
    122123
    123124**Questions**
     125
    1241261. Nous savons que l'adresse du premier registre du `TTY` est `0xd0200000` est qu'à cette adresse se trouve le registre `TTY_WRITE` du `TTY0`. Écrivez le code permettant d'écrire le code ASCII `'x'` sur le terminal 0. Vous avez droit à tous les registres du MIPS.
    125127{{{#!protected ------------------------------------------------------------------------------------
     
    168170   - `"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])
    169171 Écrivez le code assembleur créant la section ".mytext" et suivi de l'addition des registre `$5` et `$6` dans `$4`
     172{{{#!protected ------------------------------------------------------------------------------------
     173'''''''''''''''
    170174{{{#!asm
    171175 .section .mytext,"ax"
    172176 add $4,$5,$6
    173 }}}
    174 {{{#!protected ------------------------------------------------------------------------------------
    175 '''''''''''''''
    176 *
    177 '''''''''''''''
    178 }}}
    179 
    180 
    181 
    182 == A3. Chaîne de compilation
    183 
    184 
    185 == A4. Programmation en C
     177}}}
     178'''''''''''''''
     179}}}
     1801. 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.
     181{{{#!protected ------------------------------------------------------------------------------------
     182'''''''''''''''
     183{{{#!asm
     184.data
     185hello:  .asciiz "Hello"
     186.text
     187    la      $4, hello                   // $4 <- address of string
     188    la      $5, __tty_regs_map          // $5 <- address of tty's registers map
     189
     190print:
     191    lb      $8, ($4)                    // get current char
     192    sb      $8, ($5)                    // send the current char to the tty
     193    addiu   $4, $4, 1                   // point to the next char
     194    bnez    $8, print                   // check that it is not null, if ok it must be printed
     195}}}
     196'''''''''''''''
     197}}}
     1981. 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`
     199{{{#!protected ------------------------------------------------------------------------------------
     200'''''''''''''''
     201* La pile va être initialisée juste à la première adresse au-delà de la zone kdata : `0x80020000` + `0x003E0000` = `0x80400000`
     202* La première chose que fait une fonction, c'est décrémenter le pointeur de pile pour écrire `$31`, etc. Il faut donc que le pointeur ait été défini.
     203{{{#!asm
     204 la  $29, __kdata_end
     205}}}
     206'''''''''''''''
     207}}}
     208
     209== A2. Programmation en C
     210
     211
     212Vous savez déjà programmer en C, mais vous allez voir des syntaxes ou des cas d'usage que vous ne connaissez peut-être pas encore.
     213Les questions qui sont posées ici n'ont pas toutes été vues en cours, mais vous connaissez peut-être les réponses, sinon ce sera l'occasion d'apprendre.
     214
     215**Questions
     216
     2171. Pourquoi déclarer des fonctions ou des variables `extern` ? Quel est l'équivalent en assembleur ?
     2181. Quels sont les rôles du mot clés `static` en C ? (il y en a 3 à ma connaissance)
     2191. Comment déclarer un tableau de structure en variable globale ?
     220:q
    186221
    187222
     
    192227* les usages de extern/globl et de volatile
    193228* compilation conditionnelle
     229
     230== A3. Chaîne de compilation
     231
    194232
    195233