409 | | À quoi servent les mots clés `extern` et `volatile` ?\\Si `NTTYS` est une macro dont la valeur est `2`, quelle est l'adresse en mémoire `__tty_regs_map[1].read` ? (C10 annexe S23 et connaissance du C) |
410 | | {{{#!protected ------------------------------------------------------------------------------------ |
411 | | '' |
| 409 | Si `NTTYS` est une macro dont la valeur est `2`, quelle est l'adresse en mémoire `__tty_regs_map[1].read` ?\\À quoi servent les mots clés `extern` et `volatile` ? (C10 annexe S23 et connaissance du C) |
| 410 | {{{#!protected ------------------------------------------------------------------------------------ |
| 411 | '' |
| 412 | - `__tty_regs_map` est un tableau à 2 cases (puisque `NTTYS`=`2`).\\Chaque case est une structure de 4 entiers, donc `0x10` octets (16 octets).\\`read` est le troisième champ, c'est le troisième entier de la structure, donc en `+8` par rapport au début.\\En conséquence `__tty_regs_map[1].read` est en `0xd0200018` |
432 | | 5. Vous avez appris à écrire des programmes assembleur, mais parfois il est plus simple, voire nécessaire, de mélanger le code C et le code assembleur. Dans l'exemple ci-dessous, nous voyons comment la fonction `syscall()` est écrite. Cette fonction utilise l'instruction `syscall`.\\Deux exemples d'usage de la fonction `syscall()` pris dans le fichier `tp2/4_libc/ulib/libc.c` |
433 | | {{{#!c |
434 | | 1 int fprintf (int tty, char *fmt, ...) |
435 | | 2 { |
| 432 | 5. Vous avez appris à écrire des programmes assembleur, mais parfois il est plus simple, voire nécessaire, de mélanger le code C et le code assembleur. Dans l'exemple ci-dessous, nous voyons comment la fonction `syscall()` est écrite. Cette fonction utilise l'instruction `syscall`.\\Deux exemples d'usage de la fonction `syscall()` pris dans le fichier `tp2/4_libc/ulib/libc.c`. |
| 433 | {{{#!c |
| 434 | 1 int fprintf (int tty, char *fmt, ...) // tty est l'identifiant du terminal |
| 435 | 2 { // fmt est la chaine format, suivie d'une liste d'arguments optionnelz |
439 | | 6 va_start (ap, fmt); |
440 | | 7 res = vsnprintf(buffer, sizeof(buffer), fmt, ap); |
441 | | 8 res = syscall (tty, (int)buffer, 0, 0, SYSCALL_TTY_PUTS); |
| 439 | 6 va_start (ap, fmt); // définit le dernier argument non-optionnel |
| 440 | 7 res = vsnprintf(buffer, sizeof(buffer), fmt, ap); // remplit le buffer avec la chaîne à afficher |
| 441 | 8 res = syscall (tty, (int)buffer, 0, 0, SYSCALL_TTY_PUTS); // ← appel système |
475 | | - oui, ce code de la fonction `syscall()` qui fait appel à l'instruction `syscall` aurait pu être mis dans un fichier en assembleur, mais cela aurait demandé d'avoir un fichier de plus, pour une seule fonction. Dans une version plus évoluée du système, il y aura un d'autres fonctions assembleur, alors on créera un fichier assembleur pour les réunir. |
476 | | '' |
477 | | }}} |
| 475 | - oui, ce code de la fonction `syscall()` qui fait appel à l'instruction `syscall` aurait pu être mis dans un fichier en assembleur, mais cela aurait demandé d'avoir un fichier de plus, pour une seule fonction. Dans une version plus évoluée du système, il y aura d'autres fonctions assembleur, alors on créera un fichier assembleur pour les réunir. |
| 476 | '' |
| 477 | }}} |
| 478 | |