Le langage assembleur est un langage de programmation de bas niveau de programmation qui expose les instructions utilisées par l’ordinateur pour faire fonctionner son matériel. Dans cet article, nous explorons le langage assembleur comme une introduction à la programmation avec des exemples et des explications de code. Si vous vous êtes déjà demandé ce qu’est un « pointeur » ou une « pile » et si vous devez apprendre l’assembleur dans votre quête pour devenir un programmeur, continuez à lire. Cet article explique ce qu’est le langage assembleur, ses avantages et ses inconvénients, des exemples d’utilisation courante des langages assembleur, et quelques ressources si vous souhaitez en savoir plus sur ce sujet. Commençons !
Définition du langage assembleur
Le langage assembleur est un langage de programmation de bas niveau spécifique à un type de processeur particulier. Il est généralement écrit sous forme mnémotechnique, qui est une représentation symbolique du code machine généré par l’assembleur. En langage assembleur, les codes opérationnels des instructions machine sont remplacés par des mnémoniques, et les adresses des instructions ou des opérandes sont remplacées par des symboles d’adresse ou des étiquettes. Sur différents appareils, le langage assembleur correspond à différents ensembles d’instructions de langage machine et est converti en instructions machine par le processus d’assemblage. Il existe une correspondance un-à-un entre un langage assembleur spécifique et un ensemble d’instructions de langage machine spécifique, et il n’est pas directement portable entre différentes plateformes.
Histoire du langage assembleur
L’histoire du langage assembleur remonte aux débuts de l’informatique. L’un des premiers langages assembleur a été créé dans les années 1950 pour l’ordinateur IBM 701. Ce langage, appelé Autocode, a été développé par Alick Glennie et était basé sur le code existant utilisé pour le prédécesseur du 701, l’IBM 650.
Autocode a été bientôt suivi par un certain nombre d’autres langages assembleur, notamment FORTRAN Assembly Language (FAL) et COBOL Assembly Language (CAL). Ces langages ont été conçus pour faciliter la programmation dans leurs langages de haut niveau respectifs, et ils ont connu un grand succès.
Langage de programmation
Depuis l’avènement du premier ordinateur électronique au monde en 1946, la manière et le langage de communication entre les humains et les machines sont devenus la principale direction de recherche des ingénieurs logiciels et des professionnels de l’informatique. Des langages de programmation plus efficaces et plus simples sont devenus les nouveaux chouchous des ingénieurs logiciels. Avec le développement rapide des ordinateurs, la vitesse de mise à niveau du matériel informatique s’accélère de plus en plus, et les exigences en matière de langages de programmation deviennent de plus en plus strictes. Les langages de programmation ont parcouru un long chemin au cours des dernières décennies, et il y a eu 3 générations de langages à ce jour. Afin de répondre aux exigences de programmation et aux fonctions logicielles dans différents domaines, un grand nombre de langages de programmation ont subi le processus de modification, de remplacement et de développement, et ont finalement évolué vers la diversification des langages de programmation actuels. Malgré de nombreuses tentatives pour trouver un langage universel capable de s’adapter à tous les environnements de programmation, aucune d’entre elles n’a réussi. Le langage de programmation fait des bonds en avant avec la technologie moderne, et la sagesse humaine se manifeste de plus en plus.

1ère génération : Langage machine
Le langage machine est le premier langage de programmation. Au début de l’invention de l’ordinateur, afin de contrôler l’ordinateur pour qu’il accomplisse ses propres tâches ou projets, les gens ne pouvaient écrire que des chaînes binaires de nombres tels que « 0 » et « 1 » pour contrôler l’ordinateur. Ce langage est le langage machine. Intuitivement, le langage machine est très obscur et difficile à comprendre, et sa signification est souvent comprise en consultant des tableaux ou des manuels. Il est très pénible à utiliser, surtout lorsque vous devez modifier le programme terminé. Ce type de langage machine désordonné vous empêchera de démarrer, et il sera difficile de trouver des erreurs de programme. De plus, l’environnement d’exploitation de différents ordinateurs est différent, et les instructions et les méthodes de fonctionnement sont également différentes. Donc, lorsque vous avez une spécificité dans ce langage machine, vous ne pouvez l’exécuter que sur un ordinateur spécifique. Et une fois que vous changez de machine, vous devez reprogrammer, ce qui réduit considérablement l’efficacité d’utilisation et de promotion du programme. Cependant, en raison de la spécificité du langage machine, il est parfaitement adapté à un type spécifique d’ordinateur, de sorte que son efficacité de fonctionnement est beaucoup plus élevée que celle des autres langages.

2ème génération : Langage assembleur
Il n’est pas difficile de voir que le langage machine, en tant que langage de programmation, a une mauvaise flexibilité et lisibilité. Afin d’atténuer l’inconfort causé par le langage machine aux ingénieurs logiciels, les gens ont amélioré et perfectionné le langage machine : en utilisant des lettres et des mots faciles à comprendre et à retenir pour remplacer une instruction spécifique. Grâce à cette méthode, il est facile pour les gens de lire le programme terminé ou de comprendre la fonction que le programme exécute, et la correction des bogues, l’exploitation et la maintenance du programme existant deviennent plus faciles et plus pratiques. Ce langage est ce que nous appelons le langage assembleur, le deuxième langage informatique de génération.

Comparé au langage machine, le langage assembleur a des dépendances machine plus élevées et est plus facile à mémoriser et à écrire, mais conserve en même temps la haute vitesse et le haut rendement du langage machine. Le langage assembleur est toujours un langage orienté machine, il est difficile de comprendre l’intention de conception du programme à partir de son code, et le programme conçu n’est pas facile à transposer, il n’est donc pas aussi largement utilisé que la plupart des autres langages informatiques de haut niveau. Par conséquent, dans les langages de haut niveau très développés d’aujourd’hui, il est généralement utilisé au niveau inférieur, généralement pour l’optimisation des programmes ou le fonctionnement du matériel.
3ème génération : langage de haut niveau
Après que le langage de programmation a subi la mise à jour du langage machine, du langage assembleur, etc., les gens ont découvert le facteur clé limitant la généralisation des programmes – la portabilité des programmes. Il est nécessaire de concevoir un programme qui puisse fonctionner sur différentes machines indépendamment du matériel informatique. De cette manière, de nombreux processus de programmation répétitifs peuvent être évités, et l’efficacité peut être améliorée. En même temps, le langage doit être proche du langage mathématique ou du langage naturel des êtres humains. Dans les années 1950, lorsque les ordinateurs étaient encore rares, les premiers langages de programmation de haut niveau ont vu le jour. À cette époque, le coût des ordinateurs était élevé, mais la quantité de calcul par jour était limitée. Comment utiliser efficacement la puissance de calcul limitée des ordinateurs est devenu un problème auquel les gens étaient confrontés à cette époque. En même temps, en raison de la rareté des ressources, l’efficacité de fonctionnement des ordinateurs est également devenue l’objectif poursuivi par les ingénieurs de cette époque.

Composition du langage assembleur
En raison du système d’instructions d’assemblage très vaste, il est nécessaire de construire un système de système d’instructions, qui comporte un grand nombre d’instructions, des formats complexes et une faible mémorisation. La partie la plus difficile de l’instruction est le mode d’adressage pris en charge par l’instruction, et son essence est de savoir comment obtenir l’opérande dans l’instruction. Pour le processeur, il s’agit de savoir comment trouver les données dont il a besoin. Cependant, pour le langage d’assemblage au plus bas de l’ordinateur, cette méthode d’adressage impliquera un grand nombre de formats de stockage de calcul et est étroitement liée à la méthode complexe de gestion du stockage, ce qui la rend difficile à comprendre. Enfin, les instructions d’assemblage sont également liées à la manière d’affecter les indicateurs, mais les indicateurs du processeur sont très complexes, il est donc plus difficile de saisir le mécanisme.
envoyer une commande
Les instructions de commande d’envoi comprennent :
- instruction générale de transfert de données : MOV ;
- instruction de transfert conditionnel : CMOVcc ;
- instruction d’opération de pile : PUSH, PUSHA, PUSHAD, POP, POPA, POPAD ;
- instruction d’échange : XCHG, XLAT, BSWAP ;
- instruction de transfert de sélecteur de descripteur d’adresse ou de segment : LEA, LDS, LES, LFS, LGS, LSS, etc.
opération logique
Cette partie des instructions est utilisée pour effectuer des opérations arithmétiques et logiques, notamment :
- instruction d’addition : ADD, ADC ;
- instruction de soustraction : SUB, SBB ;
- instruction d’incrémentation : INC ;
- instructions d’ajustement décimal : AAA, AAS, DAA, DAS ;
- instruction de décrémentation : DEC ;
- instruction d’opération de comparaison : CMP ;
- instructions d’extension de signe : CBW, CWDE, CDQE ;
- instruction de multiplication : MUL, IMUL ;
- instruction de division : DIV, IDIV ;
- instructions d’opération logique : AND, NOT, OR, XOR, TEST.
instruction de décalage
Cette partie de l’instruction est utilisée pour déplacer un opérande de registre ou de mémoire un nombre de fois spécifié.
- instruction de décalage logique vers la gauche : SHL ;
- instruction de décalage logique vers la droite : SHR ;
- instruction de décalage arithmétique vers la gauche : SAL ;
- instruction de décalage arithmétique vers la droite : SAR ;
- instruction de décalage circulaire vers la gauche : ROL ;
- instruction de décalage circulaire vers la droite : ROR, etc.
manipulation de bits
Cette partie des instructions comprend :
- l’instruction de test de bit : BT ;
- l’instruction de test et de définition de bit : BTS ;
- l’instruction de test et de réinitialisation de bit : BTR ;
- l’instruction de test et de négation de bit : BTC ;
- l’instruction de balayage avant de bit : BSF ;
- l’instruction de balayage arrière de bit : BSR.
transfert de contrôle
Cette partie comprend :
- instruction de transfert inconditionnel : JMP ;
- instruction de transfert conditionnel : JCC, JCXZ ;
- instruction de boucle : LOOP, LOOPE, LOOPNE ;
- instruction d’appel de procédure : CALL ;
- instruction de retour de sous-procédure : RET ;
- instruction d’interruption : INTn, INT3, INTO, IRET et ainsi de suite.
Manipulation de chaînes de caractères
Cette partie des instructions est utilisée pour opérer sur les chaînes de données, notamment :
- l’instruction de transfert de chaîne : MOVS ;
- l’instruction de comparaison de chaîne : CMPS ;
- l’instruction de scan de chaîne : SCANS ;
- l’instruction de sauvegarde de chaîne : STOS ;
- l’instruction de chargement de chaîne : LODS.
Entrée/Sortie
Cette partie des instructions est utilisée pour échanger des données avec des périphériques, notamment les instructions d’entrée de port IN/ INS, les instructions de sortie de port OUT/OUTS.
Exemple de langage assembleur
Voici un simple programme en langage assembleur qui additionnera deux nombres :
; add.asm
;
; This program adds two numbers together
;
section .data
; These are the two numbers we will be adding
; We must store them in memory so the CPU can access them
num1: dw 1234
num2: dw 5678
section .text
; This is the code section of the program
; The code is a set of instructions for the CPU to execute
global _start
_start:
; Load the two numbers into registers
mov eax, [num1]
mov ebx, [num2]
; Add the numbers together
add eax, ebx
; Store the result in the num1 memory location
mov [num1], eax
; Exit the program
mov eax, 1
int 0x80
Caractéristiques du langage assembleur
1. Dépendance de la machine
Il s’agit d’un langage de bas niveau, orienté machine, généralement conçu pour un ordinateur ou une famille d’ordinateurs particulière. Étant donné qu’il s’agit d’une représentation symbolique des instructions machine, différents ordinateurs ont différents langages d’assemblage.
2. Haute vitesse et haut rendement
Le langage d’assemblage conserve les avantages du langage machine et présente les caractéristiques de la directivité et de la simplicité. Il peut accéder et contrôler efficacement divers périphériques matériels de l’ordinateur, tels que les disques, la mémoire, le CPU, les ports d’E/S, etc., et occupe moins de mémoire et a une vitesse d’exécution rapide, ce qui en fait un langage de programmation efficace.
3. La complexité de l’écriture et du débogage
Parce que le matériel est directement contrôlé, et que des tâches simples nécessitent également beaucoup d’instructions en langage d’assemblage, il est nécessaire de couvrir tous les aspects lors de la conception de programmes. Tous les problèmes possibles doivent être pris en compte, et diverses ressources logicielles et matérielles doivent être allouées et utilisées de manière raisonnable. De cette façon, cela augmentera inévitablement la charge de travail du programmeur. De même, lors du débogage d’un programme, une fois qu’il y a un problème avec le fonctionnement du programme, il est difficile de le trouver.
Avantages
En tant que langage de programmation de deuxième génération au-dessus du langage machine, le langage d’assemblage présente également de nombreux avantages :
- Peut facilement lire l’état de la mémoire et l’état de l’interface d’E/S matérielle.
- Le code écrit peut être exécuté avec précision car il y a beaucoup moins de liens de compilation.
- En tant que langage de bas niveau, il est hautement extensible.
Inconvénients
- Parce que le code est très monotone et qu’il y a peu de caractères d’instruction spéciaux, cela rend le code verbeux et difficile à écrire.
- Parce que l’assembleur doit encore appeler la mémoire pour stocker les données lui-même, il est facile d’avoir des bugs, et il n’est pas facile de les déboguer.
- Même si un programme est terminé, il faudra beaucoup de temps pour le maintenir plus tard.
- En raison de la particularité de la machine, le défaut d’une mauvaise compatibilité du code est causé.
Langage d'assemblage vs Langage machine
La principale différence entre le langage d’assemblage et le langage machine est que le langage d’assemblage est un langage de programmation de bas niveau qui nécessite un assembleur séparé pour le traduire en code machine, tandis que le langage machine est une représentation directe du code machine sous-jacent.
Le langage d’assemblage est plus lisible par l’homme que le langage machine, mais il reste assez difficile à lire et à écrire. Il est conçu pour être proche du code machine natif, ce qui permet au programmeur de comprendre facilement ce que fait le code. Cependant, cela rend également plus difficile l’écriture de code portable, car le code est étroitement lié à l’architecture spécifique de la machine.
Le langage machine, quant à lui, est le code natif de la machine, et n’est pas lisible par les humains. Il est exécuté directement par le processeur, et est donc plus efficace que le langage d’assemblage. Cependant, il est beaucoup plus difficile à programmer, car le programmeur doit gérer les instructions du code machine sous-jacent.
Ressources pour apprendre le langage d'assemblage
Si vous souhaitez en savoir plus sur le langage assembleur, de nombreuses ressources différentes sont à votre disposition. Vous pouvez trouver des livres sur le langage assembleur sur Amazon et dans les librairies locales. Vous pouvez également trouver des cours en ligne sur des sites web tels que Coursera, edX et Udemy. Si vous souhaitez en savoir plus sur l’architecture informatique, il existe également de nombreux livres sur ce sujet. Ces ressources peuvent vous aider à comprendre ce qu’est le langage assembleur et ses implications sur la conception des matériels et logiciels informatiques.



