# R3.05 # Programmation système 2024 Pomme Pompeani CC-BY-SA-NC --- ## Programmation bas-niveau - Architecture d'un ordinateur - Assembleur - Appel de fonction en C --- ## Architecture d'un ordinateur ----
Note: - Processeur - Mémoire adressable - Disque - Bus - Von Neumann - même si lui n'a fait que quelques améliorations - pro guerre, bombe atomique - Code et data au même endroit ---- ### Processeur - Mémoire très limitée : Registres - RAM pour le reste - Opérations uniquement sur des registres ---- ### Registres - sur x86-64 / amd64 - Beaucoup d'instructions possibles - 16 registres généraux - sur aarch64 / arm64 - Peu d'instructions possibles - 31 registres généraux ---- ### Exécution simplifiée - À chaque pas, le processeur : - Récupère l'instruction courante - La décode - L'exécute ---- ### Exemple interactif
Note: - Instruction counter --- ## Assembleur Instructions ---- Maths : - `INC`/`DEC` : in·dé·crémenter un registre - `ADD`/`SUB` : add/soustraire un registre à un autre - `NEG` : changer le signe d'un registre - `MUL`/`IMUL`,`DIV`/`IDIV` - ... ---- Booléens : - `AND` - `NOT` - `OR` - `XOR` - `TEST` ---- Sauts : - `SYSCALL` : Appel système - `JMP` : Sauter à une autre instruction dans le programme - `J*` : Instructions de saut conditionnel ---- Mémoire : - `MOV` : - Copier une case mémoire dans un registre - Copier un registre dans une case mémoire - Copier un registre dans un autre registre - `LEA` : Load effective address - Copie le résultat d'un calcul dans un registre - `tab[i]` - → `*(tab+i)` - → `lea [%rax + %rbx * 4]` ---- Un hello world en assembleur : ```asm section .data msg db 'Hello, World!',0 section .text global _start _start: ; Write the message to stdout mov eax, 4 ; syscall number for sys_write mov ebx, 1 ; file descriptor 1 is stdout mov ecx, msg ; pointer to message mov edx, 13 ; message length int 0x80 ; call kernel ; Exit the program mov eax, 1 ; syscall number for sys_exit xor ebx, ebx ; exit code 0 int 0x80 ; call kernel ``` ---- ## Assembleur 👈👉 C ---- - Points communs : - Pointeurs - Opérations de base (copie, addition, etc.) - Différences : - Types - Fonctions - Boucles - Noms - Registres ---- Pointeurs : ```asm MY_TAB times 10 dd 0 ; Alloc 10 x 4 bytes init to 0 mov ebx, [MY_TAB] ; Address of MY_TAB in ebx mov [ebx], 110 ; MY_TAB[0] = 110 add ebx, 2 ; ebx = ebx + 2 mov [ebx], 123 ; MY_TAB[1] = 123 ``` ---- ### Appel de fonction ```c void q() { } void p() { q(); } int main(int argc, char **argv) { p(); } ``` ---- ### Appel de fonction Principe :
Sauvegarde du contexte. Changement de contexte. Retour au contexte précédent. ---- ### La pile - Call stack - La pile permet l'appels de fonctions. - Fonctionnement de base d'un programme. ---- ### Cadre d'exécution - Stack Frame - Variables locales d'une fonction - Arguments passés à la fonction - Espace pour le retour ---- ```c int draw_square(int x, int y, int size) { draw_line(x, y, x+size, y) draw_line(x, y, x, y+size) draw_line(x+size, y, x+size, y+size) draw_line(x, y+size, x+size, y+size) } int draw_line(int x1, int y1, int x2, int y2) { // ... } ``` ----
---- En réalité : - Beaucoup d'optimisations - Utilisation des registres pour les paramètres - Remplacement de l'appel par du code *inline* - ... - Conventions différentes - langage - processeur - système d'exploitation Note: Convention d'appel internationale : celle du C.