« Assembleur/Le langage assembleur » : différence entre les versions

Contenu supprimé Contenu ajouté
Belebostre (discussion | contributions)
Parie "UNIX" prise en partie sur Wikipédia. Chapitre à éttofer.
(Aucune différence)

Version du 9 août 2009 à 11:35

Logo de la faculté
Cette page est une ébauche concernant l’informatique. Avant de recréer une ressource du même type, essayez d'abord de compléter celle-ci ; si c'est impossible, remplacez son contenu par le vôtre. Si vous êtes l'auteur(e) de cette page et que vous souhaitez la continuer, retirez ce bandeau.
Début de la boite de navigation du chapitre
Le langage assembleur
Icône de la faculté
Chapitre no {{{numéro}}}
Leçon : Assembleur
Chap. préc. :Le programme assembleur
fin de la boite de navigation du chapitre
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.

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 à aussi l'avantage d'être rapide et extrêmement léger. C'est sans doute le langage préféré de tout 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.

Principe de programmation

Une actions 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.
Exemple : pour calculer (7+6)%, 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 mise dans DX

Ce code sera théoriquement traité en 5 tours d'horloges, soit, pour un microprocesseur à 3GHz, environ 1,7 nanoseconde.

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 tache à un programme, et d'utiliser un JMP (saut) ou un CALL (appel à une procédure). Une fois arriver au bout du programme, celui-ci est quitté.

Toujours surveiller la mémoire

Si pour une raison ou une autres, 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 où 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 qu'y puisse arriver est un redémarrage.

Premier programme en ASM

Windows

Hello.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 "Hello, World !", '$'	; On défini la chaine de caractère 'message', terminée par '$'

il vous suffit, pour assembler votre programme, de taper dans une fenêtre MS-DOS :

nasm Hello.asm -f bin -o Hello.com

UNIX

Hello.asm

message db 'Hello, World !', 10h	; On défini la chaîne de caractère '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éfinie 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 Hello.asm -f elf -o Hello.o