Langage d'assemblage - Introduction
Le langage d'assemblage est la couche la plus proche du matériel dans la famille des langages de programmation informatique ; il s'agit d'une représentation mnémonique lisible par l'homme des instructions machine.
Comprendre l'essence du langage d'assemblage est la première étape pour apprendre en profondeur les systèmes informatiques.
Qu'est-ce que le langage d'assemblage
Le CPU d'un ordinateur ne peut comprendre et exécuter que0s et 1squi composent le code machine binaire.
Par exemple, dans l'architecture x86, le code machineB8 2A 00 00 00représente le déplacement de la valeur 42 dans le registre EAX.
Écrire directement du code machine binaire est extrêmement difficile et source d'erreurs pour les humains, c'est pourquoi le langage d'assemblage a vu le jour.
Le langage d'assemblage utilise desmnémoniques (Mnemonic)lisibles par l'homme pour représenter ces instructions binaires. Par exemple, le code machine ci-dessus s'écrit en assemblage comme suit :
Exemple
Un assembleur est chargé de traduire ces mnémoniques en code machine que le CPU peut exécuter.
Dans l'exemple ci-dessus,movest le mnémonique,eaxest l'opérande de destination,42est l'opérande source.
Le langage d'assemblage utilise des mnémoniques pour remplacer les opérations du langage machine, prend en charge les étiquettes et les symboles pour faire référence à des adresses et des constantes, évitant le codage en dur. Le langage d'assemblage correspond approximativement de manière biunivoque à l'ensemble d'instructions du langage machine correspondant.

Relation entre le langage d'assemblage et le code machine
Entre les instructions d'assemblage et les instructions machine, il existe une relationde correspondance un à un.
Chaque instruction d'assemblage correspond précisément à une instruction machine du CPU, sans couche d'abstraction intermédiaire.
| Form | Exemple | Description |
|---|---|---|
| Code machine (binaire) | 10111000 00101010 00000000 00000000 00000000 | Instructions exécutées directement par le CPU |
| Code machine (hexadécimal) | B8 2A 00 00 00 | Représentation du code machine lisible par l'humain |
| Langage d'assemblage | mov eax, 42 | Représentation mnémonique lisible par l'homme |
Le langage d'assemblage et le code machine ont une correspondance biunivoque, mais les processeurs de différentes architectures ont des jeux d'instructions différents. Par exemple, la syntaxe d'assemblage de x86 et ARM est complètement différente.
Différences entre le langage d'assemblage et les langages de haut niveau
La figure suivante montre les différents chemins du code source à l'exécution pour les langages de haut niveau et le langage d'assemblage :
| Fonctionnalité | Langage d'assemblage | Langage de haut niveau (par exemple, Python) |
|---|---|---|
| Niveau d'abstraction | Niveau le plus bas, manipule directement le matériel | Haut niveau, le système d'exploitation et l'environnement d'exécution encapsulent les détails |
| Taille du code | Les fonctions simples nécessitent beaucoup de code | Une petite quantité de code met en œuvre des fonctions complexes |
| Lisibilité | Difficile à lire et à maintenir | Convivial, facile à comprendre |
| Efficacité d'exécution | La plus élevée, aucun surcoût d'exécution | Plus faible, présente un surcoût d'interprétation ou de compilation |
| Contrôle du matériel | Contrôle total du CPU et de la mémoire | Accès indirect via des interfaces abstraites |
| Portabilité | Médiocre, nécessite une réécriture pour différents CPU | Bien, le même code peut s'exécuter sur plusieurs plateformes |
Scénarios d'application du langage d'assemblage
Bien que le langage d'assemblage ne soit pas un choix courant pour le développement quotidien, il reste irremplaçable dans des domaines spécifiques :
| Champ | Application spécifique |
|---|---|
| Noyau du système d'exploitation | Le bootloader, la commutation de contexte, la gestion des interruptions, etc. doivent être écrits en assembleur |
| Systèmes embarqués | Les appareils dont les ressources sont extrêmement limitées nécessitent un contrôle matériel précis |
| Rétro-ingénierie | Analyser les logiciels malveillants, contourner les protections logicielles, comprendre la logique des programmes à code source fermé |
| Code sensible aux performances | Fonctions essentielles avec des exigences de performances extrêmement élevées, telles que les algorithmes de chiffrement et les codecs audio/vidéo |
| Recherche en sécurité | Écriture de shellcode, de code d'exploit |
| Développement de compilateurs | Compréhension de la génération de code cible, écriture ou optimisation de backends de compilateur |
Introduction à l'architecture x86
x86Il s'agit d'une architecture de microprocesseur introduite par Intel, à commencer par le processeur 8086 en 1978, et qui a connu des générations telles que 80286, 80386 (i386), 80486, Pentium, etc.
x86 est l'architecture de processeur (CPU) pour ordinateurs de bureau et serveurs la plus largement utilisée, et une plate-forme idéale pour apprendre le langage assembleur.
Ce tutoriel utilisel'architecture x86 32 bits(également appelée IA-32 ou i386) comme base d'enseignement, car son modèle de registres est concis et clair, adapté aux débutants.
L'assembleur x86 32 bits est le meilleur point de départ pour apprendre le langage assembleur. Après avoir maîtrisé le 32 bits, passer au 64 bits (x86-64) est très naturel, car ce dernier est une extension du premier.
Introduction à l'assembleur NASM
NASM(Netwide Assembler)C'est un assembleur x86 open source qui prend en charge plusieurs formats de sortie et tous les principaux systèmes d'exploitation.
Comparé à MASM (Microsoft Assembler) et GAS (GNU Assembler), la syntaxe de NASM est plus claire et plus intuitive, ce qui en fait le meilleur choix pour apprendre le langage assembleur.
| Assembleur | Style de syntaxe | Plateforme | Fonctionnalités |
|---|---|---|---|
| NASM | Syntaxe Intel | Multiplateforme | Open source, syntaxe claire, documentation complète |
| MASM | Syntaxe Intel | Windows | Officiel Microsoft, puissant mais limité à une plateforme |
| GAS | Syntaxe AT&T | Multiplateforme | Chaîne d'outils GNU par défaut, la syntaxe est contre-intuitive |
Ce tutoriel utilise exclusivement l'assembleur NASM avec la syntaxe de style Intel.
Autres extensions