Réseau Libre-entreprise : 2le | Code Lutin | Easter-eggs | eLeDo | Freeskop | iScream.Net | Les Développements Durables | LibrenBerry | Open Via | Praksys | Nereide | Eitic | Entr'ouvert Laboratoire Libre-entreprise
logo banniere easter-eggs.org pixel pixel Visiter Easter-Eggs.com
proposer un article intercal Envoyer un e-Mail a Easter-Eggs.org intercal Consulter le plan du site intercal administration du site intercal Retour a la page d'accueil
pixel
pixel
pixel Vous êtes ici : Logiciels Libres > Assembleur x86, 1ère partie (suite)
pixel
pixel
English

Autour d’Easter-eggs
pixel pixel puce Coups de coeur
pixel pixel puce Débats & travaux en cours
pixel pixel puce Projets

L’association
pixel
pixel pixel L’ensemble des articles relatifs à l’association Easter-eggs.org.
pixel
pixel pixel puce Assemblées générales
pixel pixel puce Comptabilité
pixel pixel puce Réunions
pixel pixel puce Statuts

L’entreprise
pixel
pixel pixel L’ensemble des articles relatifs à l’entreprise Easter-eggs
pixel
pixel pixel puce Assemblées générales
pixel pixel puce Comptabilité
pixel pixel puce Fonctionnement
pixel pixel puce Statuts

Logiciels Libres
pixel pixel puce Histoire, Philosophie
pixel pixel puce Nos contributions
pixel pixel puce Trucs et astuces
pixel pixel puce Tutoriaux



logo GNU

logo debian

Tux, logo du noyeau linux

pixel
Assembleur x86, 1ère partie (suite)

lundi 8 avril 2002, par Emmanuel Saracco


Comment ça fonctionne ?

L’assembleur permet d’opérer directement sur le processeur, la mémoire ou les périphériques. Sa syntaxe est simple, pour ne pas dire rudimentaire, et toutes les opérations possibles ne sont faites qu’à l’aide de quelques instructions comme mov, push, pop etc. En règle générale, les instructions sont nommées assez explicitement pour que l’on comprenne plus ou moins intuitivement l’opération effectivement réalisée :

Instruction Opération effectuée
mov Permet de « bouger » des données d’un emplacement à un autre (espace mémoire ou registre processeur)
push Sert à « pousser » des données sur la pile
pop Permet de récupérer les données empilées via push
... ...

Que veut dire exactement « s’adresser directement au processeur » ? Les langages de plus haut niveau ne permettent-ils pas cela également ?

En fait, le compilateur ne peut pas passer directement du C au bytecode. Il est obligé d’implémenter un analyseur syntaxique complexe qui interprètera ce que le programmeur à voulu faire dans un jargon particulier (C, Pascal etc.).

Lorsque vous codez en assembleur, vous ne dites pas A = 0, mais vous demandez directement au processeur de mettre un registre à 0, par exemple. La variable A sera en fait le registre eax ou une de ses subdivisions (al, ah ou ax [1]) et sa mise à 0 pourra se faire de plusieurs manières :

-  Explicitement mov eax,0.
-  Via une opération logique : xor eax,eax. Cette seconde voie étant bien plus rapide que la première.

Un compilateur C pourra par exemple traduire le code suivant :


A = 0
B = 0

en :


xor eax,eax
mov A,eax
xor eax,eax
mov B,eax

On ne peut pas dire que cela soit optimum... Si nous avions fait cela directement en assembleur, nous aurions évité de définir 2 variables en utilisant le plus possible les registres :


xor eax,eax
xor ebx,ebx

Comme vous l’aurez compris, tout se passe souvent dans le détail, mais au bout du compte, c’est ce qui fera la différence. gcc et les compilateurs modernes génèrent du code de plus en plus optimisé, mais cela restera toujours de la génération automatique et le bytecode se verra toujours pollué de choses inutiles.

On pourrait cependant se demander en quoi une instruction xor est plus proche de la machine qu’une instruction C. En fait, les instructions assembleur sont juste étudiées pour être un peu plus digestes que du code hexadécimal ou binaire ; mais elles y ont leur équivalent exact. Par exemple xor ax,ax se traduira directement par le code hexadécimal 31C0 qui lui-même représente le code machine 0011000111000000. Il faut donc bien comprendre qu’en codant en assembleur, on code en fait quasi directement en binaire, et rien ne vient interférer entre ce que l’on veut faire et la façon dont cela sera effectivement fait.

Conclusion

Ce premier article devrait vous avoir permis de comprendre simplement un peu mieux ce qu’on entend par « langage d’assemblage ».

Contenu des prochains articles

Dans les prochains articles nous étudierons quelques instructions couramment utilisées ainsi que la façon dont on implémente les différents types de boucles (while, for, until). Nous en profiterons aussi pour regarder d’un peu plus près les registres processeur les plus utilisés et pour décrire leur rôle (accumulateur, compteur etc.).

Par la suite, nous verrons que les assembleurs modernes permettent au programmeur d’écrire un code un peu plus structuré et plus lisible, via les définitions de macros, les fonctions, les includes etc.

DEBUT de cet article - ARTICLE suivant

N’hésitez pas a faire des remarques et à exprimer vos souhaits. Toute participation sera la bienvenue.

En attendant, bon code :-)


[1] Nous ne sommes pas encore entré dans les détails des registres, mais anticipons un peu en disant seulement qu’un registre peut contenir des données de différentes tailles : al et ah contiennent des données sur 8 bits et constituent à eux deux le registre ax qui lui contient des données sur 16 bits. Au-dessus nous avons le registre eax qui permet de stocker des données sur 32 bits (il n’existe pas de découpage en 2x16 bits comme pour ax).


pixel pixel pixel

Dans la même rubrique :
puce Assembleur x86, 1ère partie
puce Assembleur x86, 2ème partie
puce Assembleur x86, 2ème partie (suite)
puce Assembleur x86, 3ème partie
puce Assembleur x86, 3ème partie (suite)
puce Comment créer de la musique avec GNU/Linux
puce Guide simplifié pour QEMU
puce Introduction à LDAP

pixel
pixel
pixel


Proposer un article | Nous contacter | Plan du site | Admin | Accueil



Fatal error: Cannot redeclare spip_connect_ldap() (previously declared in /var/www/eeweb/eeorg/public_html/ecrire/inc_connect.php3:9) in /var/www/eeweb/eeorg/public_html/ecrire/inc_connect.php3 on line 12