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

mov eax, 42    ; Déplacer la valeur 42 dans le registre EAX

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.

FormExempleDescription
Code machine (binaire)10111000 00101010 00000000 00000000 00000000Instructions exécutées directement par le CPU
Code machine (hexadécimal)B8 2A 00 00 00Représentation du code machine lisible par l'humain
Langage d'assemblagemov eax, 42Repré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 :

高级语言 vs 汇编语言对比

FonctionnalitéLangage d'assemblageLangage de haut niveau (par exemple, Python)
Niveau d'abstractionNiveau le plus bas, manipule directement le matérielHaut niveau, le système d'exploitation et l'environnement d'exécution encapsulent les détails
Taille du codeLes fonctions simples nécessitent beaucoup de codeUne petite quantité de code met en œuvre des fonctions complexes
LisibilitéDifficile à lire et à maintenirConvivial, facile à comprendre
Efficacité d'exécutionLa plus élevée, aucun surcoût d'exécutionPlus faible, présente un surcoût d'interprétation ou de compilation
Contrôle du matérielContrôle total du CPU et de la mémoireAccès indirect via des interfaces abstraites
PortabilitéMédiocre, nécessite une réécriture pour différents CPUBien, 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 :

ChampApplication spécifique
Noyau du système d'exploitationLe bootloader, la commutation de contexte, la gestion des interruptions, etc. doivent être écrits en assembleur
Systèmes embarquésLes appareils dont les ressources sont extrêmement limitées nécessitent un contrôle matériel précis
Rétro-ingénierieAnalyser les logiciels malveillants, contourner les protections logicielles, comprendre la logique des programmes à code source fermé
Code sensible aux performancesFonctions 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 compilateursCompré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.

AssembleurStyle de syntaxePlateformeFonctionnalités
NASMSyntaxe IntelMultiplateformeOpen source, syntaxe claire, documentation complète
MASMSyntaxe IntelWindowsOfficiel Microsoft, puissant mais limité à une plateforme
GASSyntaxe AT&TMultiplateformeChaî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