← Retour à la page de la matière
🧠 Cours Complet — Langage Assembleur (x86-64)
📘 Section 1 — Introduction & Contexte
🔹 Qu’est-ce que le langage assembleur ?
Le langage assembleur (Assembly) est un langage de bas niveau qui permet de dialoguer directement avec le processeur.
Chaque instruction assembleur correspond à une seule instruction machine, spécifique à une architecture donnée (x86, ARM, MIPS, RISC-V, etc.).
Le code assembleur est donc proche du matériel, mais reste plus lisible que le binaire pur.
🎯 Pourquoi apprendre l’assembleur ?
- Comprendre ce qui se passe sous le capot : compilation, exécution CPU.
- Optimiser les performances : écrire du code ultra-rapide pour OS, crypto, drivers...
- Déboguer et analyser : reverse engineering, exploit analysis.
- Culture informatique : tout logiciel repose sur de l’assembleur exécuté en CPU.
⚙️ Pourquoi l’assembleur x86-64 ?
- Processeur le plus répandu (Intel, AMD).
- Support natif sur la majorité des PC et serveurs.
- Compatible 32 bits (x86).
- Permet d’apprendre une ISA riche et complète.
⚠️ Inconvénient : l’assembleur x86-64 est très vaste, verbeux et non portable.
🧩 Section 2 — Architecture de Von Neumann
🧠 Principe
Modèle où instructions et données partagent la même mémoire.
| Élément | Fonction |
| CPU | Exécute les instructions |
| RAM | Stocke instructions et données |
| Bus | Transport données/adresses |
🔁 Cycle d’exécution
- Fetch → Récupère l’instruction
- Decode → Décode opération + opérandes
- Execute → Exécute via l’ALU/registres
- Write Back → Stocke le résultat
🏗️ Section 3 — Niveaux de Langage
| Niveau | Exemple | Caractéristiques |
| Haut niveau | Python, C, Java | Portable, lisible |
| Assembleur | x86-64, ARM | Non portable, lisible expert |
| Machine | Binaire | Non lisible humainement |
Exemple :
| Langage | Code |
| C | a = b + c; |
| Assembleur |
mov eax, [b]
add eax, [c]
mov [a], eax
|
| Machine | 10001011 00000100 |
💾 Section 4 — CPU, RAM et registres
🧮 Mémoire
RAM = programme + données, mais accès plus lent que registres.
⚙️ Registres
Emplacements internes rapides du CPU.
| Registre | Usage |
| RAX | Accumulateur |
| RBX | Base |
| RCX | Compteur |
| RDX | Données / reste division |
| RSI/RDI | Source/destination |
| RBP/RSP | Gestion de pile |
| R8 → R15 | Registres additionnels |
...
📚 Section 12 — Ressources
- Programming from the Ground Up — Jonathan Bartlett
- Intel 64 and IA-32 Architectures Software Developer’s Manual (Intel)
- Computer Systems: A Programmer’s Perspective — Bryant & O’Hallaron
🧠 Section 13 — Astuces & bonnes pratiques
- Utiliser les registres autant que possible.
- Sauvegarder les registres avant un
call.
- Syscalls Linux : numéro dans
rax, args dans rdi/rsi/rdx....
- Lire le désassemblage pour comprendre l’optimisation.
- Utiliser NASM/GAS + Linux pour un environnement simple.