< Assembleur
fin de la boite de navigation du chapitre

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 de faible volume. 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 15 839 octets, alors que le même programme affichant le même message en Assembleur pèse 23 octets.

Principe de programmation

Syntaxe

La syntaxe du code assembleur est relativement simple.

%ma_macro PUSH AX ; Ceci est une macro
; ce qui se trouve après ';' est un commentaire
MOV AX, 6 	 ; Une instruction simple, le registre AX est affecté de la valeur 6

Les macros seront plus détaillées dans le chapitre 7.

Les instructions

Tous les microprocesseurs sont conçus pour être programmables à l'aide d'instructions en langage machine, c'est-à-dire en code binaire.

En revanche, le code assembleur utilise des instructions en texte, appelé code source.

Ce code source texte est ensuite compilé, par un programme spécial nommé compilateur, pour produire du code binaire.

Pour les microprocesseurs de la famille x86, il existe un grand nombre d'instructions, allant des plus courantes, telle que ADD pour additionner deux nombres, aux plus complexes, telle que XCHG permettant l'échange de valeurs entre deux registres. Les processeurs succédant au x86 ont vu apparaître de nouvelles fonctionnalités, telle que l'unité de calcul des nombres à virgule flottante de la famille x87.

Une instruction par ligne

Le langage assembleur ne peut exécuter que des actions simples par rapport à celles des langages de programmation de plus haut niveau.

Chaque ligne ne contient qu'une instruction.

Selon sa complexité, une instruction en code assembleur peut s'exécuter en un seul ou plusieurs cycles d'horloge du microprocesseur.

De plus, une même instruction peut coûter plus ou moins de cycles d'horloge selon le modèle de processeur.

Exemple

pour calculer (7+6)%3, on aura le code suivant :

MOV AX, 7	; AX, qui est mis à 7, sera la destination
ADD AX, 6	; On ajoute à AX la valeur 6, le résultat étant stocké dans la destination, soit AX
MOV BX, 3	; On met dans BX la valeur 3 qui servira de source à la division
DIV BX		; DIV divise AX par la source, ici BX, qui vaut 3
;le résultat de la division est stocké dans la destination (BX)
;et le modulo (reste de la division qui nous intéresse ici) est mis dans DX
Fin de l'exemple

Execution en séquence

L'assembleur est exécuté ligne par ligne, de haut en bas. Le seul moyen de faire répéter une tâche à un programme est d’utiliser un JMP (saut) ou un CALL (appel à une procédure). Une fois arrivé au bout du programme, celui-ci est quitté.

Toujours surveiller la mémoire

Si pour une raison ou une autre, vous êtes amené à stocker 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

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.

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.

Premier programme en ASM

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

UNIX

Bonjour.asm

message db 'Bonjour le monde !', 10h    ; définir la chaîne de caractères 'message', terminée par le caractère 10h
taille equ $-message                    ; calculer la taille de la chaîne message

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

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é.

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 numéro 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
    }
}
Fin de l'exemple

Liens externes

Liste des instructions compatibles x86 sur Wikipédia

Cet article est issu de Wikiversity. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.