Assembleur/Le langage assembleur
Une page de Wikiversité.
Assembleur/Le langage assembleur est une ébauche concernant l'informatique. Vous pouvez aider le projet Wikiversité en l'améliorant.
| Chapitre 2 | |||
| Leçon : Assembleur | |||
|---|---|---|---|
| Chap. préc. : | Le programme assembleur | ||
| Chap. suiv. : | Fonctionnement des exécutables | ||
En raison de limitations techniques, la typographie souhaitable du titre, « Assembleur : Le langage assembleur
Assembleur/Le langage assembleur », n'a pu être restituée correctement ci-dessus.
Sommaire |
[modifier] Qu'est ce que l'assembleur
L'assembleur est un langage dit bas niveau, c'est à dire que son fonctionnement est très proche du langage machine. Cela veut aussi dire qu'une erreur de codage peut tout à fait faire planter votre machine. Mais l'avantage du langage assembleur est de pouvoir gérer jusqu'au moindre octet de mémoire et de toujours savoir quel code est exécuté par le microprocesseur à un instant donné.
L'assembleur a aussi l'avantage d'être rapide et extrêmement léger. C'est sans doute le langage préféré de tous les concepteurs de virus. Petite comparaison : un programme affichant "Hello, World !" en C pèse 15839 octets, alors que le même programme affichant le même message en Assembleur pèse 23 octets.
[modifier] Principe de programmation
[modifier] Syntaxe
Le code assembleur n'a pas une syntaxe très difficile.
%ma_macro PUSH AX ; Ceci est une macro ; ce qui se trouve après ';' est un commentaire MOV AX, 6 ; Une instruction simple, on met 6 dans AX
Les macros seront plus détaillées dans le chapitre 7.
[modifier] Les instructions
Les microprocesseurs de type x86 ont été conçus pour répondre à un certain nombre d'instructions. La seule façon de programmer en assembleur est d'utiliser ces instructions. Il en existe un grand nombre, allant des plus courantes (ADD pour additionner deux nombres) aux plus subtiles (tel que XCHG permettant l'échange de valeurs entre deux registres. Les processeurs suivant le x86 ont vu apparaître de nouvelles fonctionnalités, telle que l'unité de calcul des nombres à virgule flottante de la famille x87.
[modifier] Une instruction par ligne
Lorsqu'on code un programme assembleur, il faut toujours garder à l'esprit que ce langage ne peut exécuter que des actions simples. On a l'habitude de dire qu'une ligne de code sera exécutée en un tour d'horloge du microprocesseur. Une ligne de code ne peut contenir qu'une instruction, ou "action".
|
Exemple |
|
pour calculer (7+6)%3, on aura le code suivant : MOV AX, 7 ; AX, qui est mis à 7, sera la destination MOV BX, 6 ; BX, qui est mis à 6, sera la source ADD AX, BX ; On ajout AX et BX, le résultat étant stocké dans la destination, soit AX MOV BX, 3 ; On met dans BX la valeur 3 DIV BX ; DIV divise AX par la source, ici BX, qui vaut 3 ;le modulo (reste de la division) est mis dans DX Ce code sera théoriquement traité en 5 tours d'horloges, soit, pour un microprocesseur à 3GHz, environ 1,7 nanoseconde. |
[modifier] De haut en bas
L'assembleur est exécuté de haut en bas, et ce sans exceptions. Le seul moyen de faire répéter une tâche à un programme, et d'utiliser un JMP (saut) ou un CALL (appel à une procédure). Une fois arrivé au bout du programme, celui-ci est quitté.
[modifier] Toujours surveiller la mémoire
Si pour une raison ou une autre, vous êtes amené à stoker de très grands nombres, faites très attention à la façon dont vous le faites.
Voici une chose à ne pas faire.
MOV AX, 715682
Cela entraînera immédiatement un dépassement de tampon, avec, si vous n'avez pas de chance, un redémarrage de votre PC. AX est un registre codé sur 2 octets, soit 16 bits, soit 2^16=65536 possibilités. On peut donc lui mettre des nombres non-signés allant de 0 à 65535 ou des nombres signés allant de -32768 à 32767. Le code correct sera alors :
MOV EAX, 715682
L'utilisation des registres sera plus détaillée dans le chapitre 4.
[modifier] Sécurité
Il n'y a aucune sécurité lorsque vous codez en ASM. Lors de l'assemblage, l'assembleur ne vous dira que ce qui l'empêche de faire son travail, il n'effectue aucune vérification des valeurs mises dans les registres. Soyez toujours vigilant, mais sachez tout de même qu'une simple erreur ne sera pas grave pour votre PC, le pire qui puisse arriver est un redémarrage.
[modifier] Premier programme en ASM
[modifier] Windows
Bonjour.asm
ORG 100h ; Fichier .com, explications dans le chapitre 3. MOV AH, 09h ; Indique le numéro de la fonction à utiliser par l'interruption MOV DX, message ; Indique le paramètre utilisé par la fonction INT 21h ; Appel de l'interruption 33 (21h), fonction numéro 9 : afficher une chaîne à l'écran. RET ; On termine l'application proprement. message db "Bonjour le monde !", '$' ; On définit la chaîne de caractères 'message', terminée par '$'
il vous suffit, pour assembler votre programme, de taper dans une fenêtre MS-DOS :
nasm Bonjour.asm -f bin -o Bonjour.com
[modifier] UNIX
Bonjour.asm
message db 'Bonjour le monde !', 10h ; On définit la chaîne de caractères 'message', terminée par le caractère 10h taille equ $-message ; On laisse l'assembleur mesurer la taille de la chaîne, et on la définit comme constante MOV EAX, 4 ; Numéro de la fonction "write" MOV EBX, 1 ; 1 pour une sortie standard MOV ECX, message ; Adresse de la chaîne a afficher MOV EDX, taille ; Taille de la 'message' INT 80h ; Interruption 128 (80h) MOV EAX, 1 ; Numéro de la fonction "exit" MOV EBX, 0 ; Code de retour INT 80h
Assemblage du code :
nasm Bonjour.asm -f elf -o Bonjour.o
[modifier] L'ASM et les langages de haut niveau
Certains langages de haut niveau permettent d'ajouter directement du code ASM dans la source d'un programme. Le compilateur n'aura alors plus qu'à le placer à l'endroit voulu dans l'exécutable. Cette technique est parfois utilisée, et ce principalement par soucis de rapidité.
[modifier] L'ASM et le C++
Les compilateurs C++ permettent l'ajout de code ASM.
|
Exemple |
|
Créer une simple fonction pour afficher une chaîne à l'écran. void my_print(char *chaine) { // En Admettant une chaîne de caractères terminée pas '$', soit par exemple "Hello, World !$\0" asm {
PUSH DX ; Sauvegarde de DX
PUSH AX ; Sauvegarde de AX
MOV AH, 09h ; Fonction n°9
MOV DX, chaine ; Adresse de la chaîne à afficher
INT 21h ; Interruption 21h
POP AX ; Remise en état de AX
POP DX ; Remise en état de DX
}
}
|