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 | }}} |
| 180 | 1. 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 |
| 185 | hello: .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 | |
| 190 | print: |
| 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 | }}} |
| 198 | 1. 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 | |
| 212 | Vous 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. |
| 213 | Les 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 | |
| 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) |
| 219 | 1. Comment déclarer un tableau de structure en variable globale ? |
| 220 | :q |