|
Cet article concerne le langage d'assemblage. Pour le programme produisant un exécutable à partir d'un source écrit dans ce langage, voir Programme assembleur.
Un langage d'assemblage ou langage assembleur ou simplement assembleur par abus de langage, abrégé ASM est, en programmation informatique, un langage de bas niveau qui représente le langage machine sous une forme lisible par un humain. Les combinaisons de bits du langage machine sont représentées par des symboles appelés mnémoniques (du grec mnêmonikos, relatif à la mémoire), c'est à dire faciles à retenir. Le programme assembleur convertit ces mnémoniques en langage machine en vue de créer par exemple un fichier exécutable. Sur les premiers ordinateurs, la tâche d'assemblage était accomplie manuellement par le programmeur.
Particularités de l'assembleurUn langage spécifique à chaque processeurLe langage machine est le seul langage qu'un processeur puisse exécuter. Or chaque famille de processeur utilise un jeu d'instructions différent. Par exemple, un processeur de la famille x86 reconnaît une instruction du type 10110000 01100001 En langage assembleur, cette instruction est représentée par un équivalent plus facile à comprendre pour le programmeur :
movb $0x61,%al
Ce qui signifie : « mettre la valeur hexadécimale 61 dans le registre 'AL' ». Ainsi le langage assembleur, représentation exacte du langage machine, est spécifique à chaque architecture de processeur. De plus, plusieurs groupes de mnémoniques ou de syntaxes de langage assembleur peuvent exister pour un seul ensemble d'instructions, créant ainsi des macro-instructions. Réversibilité du langage machineContrairement à un langage de haut niveau, il y a une correspondance un à un entre le code assembleur et le langage machine. Ainsi il est théoriquement possible de traduire le code dans les deux sens sans perte d'information.Cette opération s'appelle la Rétro-ingénierie ou le Reverse engineering en anglais. La transformation du code assembleur en langage machine est accomplie par un programme nommé assembleur, dans l'autre sens par un programme désassembleur. Les opérations s'appellent respectivement assemblage et désassemblage. En pratique, le désassemblage est un peu plus complexe que cela car lors de la création du code en assembleur on peut affecter des noms aux positions en mémoire, commenter son code, utiliser des macro instructions ou générer du code conditionnel au moment de l'assemblage. Tous ces éléments n'apparaissent pas clairement lors du désassemblage. Instructions machineDes opérations de base sont disponibles dans la plupart des jeux d'instructions
Et on trouve des instructions spécifiques avec une ou quelques instructions pour des opérations qui auraient dû en prendre beaucoup. Exemples :
Directives du langage assembleurEn plus de coder les instructions machine, les langages assembleur ont des directives supplémentaires pour assembler des blocs de données et assigner des adresses aux instructions en définissant des étiquettes ou labels. Ils sont capables de définir des expressions symboliques qui sont évaluées à chaque assemblage, rendant le code encore plus facile à lire et à comprendre. Ils ont habituellement un langage macro intégré pour faciliter la génération de codes ou de blocs de données complexes. Exemples simplesVoici quelques exemples simples :
$ gcc truc.S -c -o truc.o $ ld truc.o -o truc $ ./truc Afficher Bonjour(les commentaires se trouvent après les points-virgule)
.global _start
BONJ: .ascii "Bonjour\n" ; Definition en mémoire de la chaîne a afficher. \n correspond au saut de ligne
_start: mov $4 , %eax ; Mettre 4 dans le registre eax (appel système ''Write'')
mov $1 , %ebx ; Mettre 1 dans le registre ebx (descripteur de fichier ''STDOUT'')
mov $BONJ , %ecx ; Mettre l'adresse mémoire de notre chaîne de caractere dans le registre ecx
mov $8 , %edx ; Mettre la taille de la chaîne dans edx
int $0x80 ; Interruption 0x80, executant un appel systeme sous Linux)
mov $1 , %eax ; Mettre 1 dans eax (appel système ''Exit'')
mov $0 , %ebx ; Mettre 0 dans ebx (valeur de retour du programme)
int $0x80 ; Interruption 0x80, executant un appel systeme sous Linux)
Lire le clavier (16 caractères max) puis l'afficher# define N 16 .global _start .comm BUFF , N _start: mov $3 , %eax mov $0 , %ebx mov $BUFF , %ecx mov $N , %edx int $0x80 mov %eax , %edx mov $4 , %eax mov $1 , %ebx mov $BUFF , %ecx int $0x80 mov $1 , %eax mov $0 , %ebx int $0x80 Usage du langage assembleurIl y a des débats sur l'utilité du langage assembleur. Dans beaucoup de cas, des compilateurs-optimiseurs peuvent transformer du langage de haut niveau dans un code qui tourne de façon plus efficace qu'un code assembleur écrit à la main, tout en restant beaucoup plus facile (et moins coûteux) à écrire, à lire et à "maintenir". Cependant,
Certains compilateurs transforment, lorsque leur option d'optimisation la plus haute n'est pas activée, des programmes écrits en langage de haut niveau en code assembleur, chaque instruction de haut niveau se traduisant en une série d'instructions assembleur rigoureusement équivalentes et utilisant les mêmes symboles ; cela permet de voir le code dans une optique de débogage et de profilage, ce qui permet de gagner parfois beaucoup plus de temps en remaniant un algorithme. En aucun cas ces techniques ne peuvent être conservées pour l'optimisation finale. La programmation des systèmes embarqués, souvent à base de microcontrôleurs, est une "niche" traditionnelle pour la programmation en assembleur. En effet ces systèmes sont souvent très limités en ressources (par exemple un microcontrôleur PIC 16F84 est limité à 1024 instructions de 14 bits, et sa mémoire vive contient 136 octets). et requièrent donc une programmation de bas-niveau très optimisée pour en exploiter les possibilités. Toutefois, l'évolution du matériel fait que les composants de ces systèmes deviennent de plus en plus puissants à un coût et à une consommation électrique constants, l'investissement dans une programmation "tout assembleur" beaucoup plus coûteuse en heures de travail devient alors un non-sens en terme d'efforts. Macro-assembleurBeaucoup d'assembleurs gèrent un langage de macros. Il s'agit de regrouper plusieurs instructions afin d'avoir un enchaînement plus logique et moins fastidieux. putchar Macro car ; Prototype de la macro ifdef car ; si car est défini mov dl,car ; le mettre dans dl endif mov ah,2 ; ah=2 : fonction "putchar" en DOS int 21h ; appel au DOS endm ; fin macro est une macro qui affiche un caractère sous MS-DOS. On l'utilisera par exemple ainsi :
putchar "X"
Et cela générera :
mov dl,"X"
mov ah,2
int 21h
RéférencesArticle connexeVoir Programme assembleur Liens internes
Liens externes
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net