UNE NECESSAIRE INTRODUCTION CONCERNANT LA METHODE UTILISEE DANS
MES TUTORIELS
PAR FAISEUR
Le langage
assembleur traîne depuis longtemps la réputation d'un langage complexe,
long à coder et difficile à lire. Bien qu’il s’agisse de remarques
fondées il faut comprendre que cela n’est vrai que dans une certaine
mesure ; le langage assembleur a évolué ces dernières années et il est
devenu possible, dans la plupart des cas, de coder aussi aisément en
assembleur qu'un développeur le ferait en langage C. Autrement dit, pour
qui le souhaiterait et avec un peu d'habitude, développer un projet
ambitieux uniquement en assembleur est tout à fait faisable sans
difficulté particulière. Certains lecteurs se demanderont comment cela a
été rendu possible. Il faut simplement distinguer, sommairement, trois
approches utilisées par les programmeurs en langage assembleur:
1.
Le codage pur assembleur
Il s'agit de l'approche
"puriste", toujours utilisée de nos jours. C'est la méthode à utiliser
lorsque l'on souhaite maximiser la vitesse d'exécution d'une procédure,
d'une fonction, d'un programme. Nous y trouverons l'utilisation des
registres (eax, ebx, etc) ainsi que les instructions assembleur (mov,
jnz, call, etc). Bref c'est une syntaxe qui correspondra à peu près à ce
que vous trouverez en désassemblant un programme avec Ollydbg par
exemple. Ce type de codage est aussi utilisé pour de petits projets. Ce
format est le langage de programmation le plus proche du langage
machine.
2. Le codage "mixte"
"Mixte"
à défaut d'un meilleure terme, je résume ici l'utilisation devenue
courante de se servir de fonctions de haut niveau en codage assembleur;
il s'agit de fonctions semblables à celles utilisées dans les langages C
ou Basic. Les plus courantes sont: "if-endif", "while-endw" et
"invoke". Pour un projet standard le programme n'y perd absolument pas
en rapidité, devient plus lisible et plus simple à coder. Il s'agit de
la méthode utilisée dans la majorité des projets récents comme dans les
tutoriels de référence d'Iczelion.
3. Le codage
ajoutant des librairies et macros évoluées
Tout en
préservant un code compilé très proche ou identique à celui réalisé par
un codage 100% assembleur nous pouvons nous servir de macros évoluées
ainsi que de librairies spécifiques qui permettent de monter d'un niveau
supplémentaire dans la simplicité d'utilisation. Il devient possible de
coder de manière aussi aisée qu'en langage C dans la majorité des cas.
Evidemment plus la simplification est importante pour l'utilisateur plus
grand est le risque que le code compilé contienne des instructions
superflues ou, plus justement dit, non nécessaires pour le code final.
Concernant Masm32 un gros travail a été accompli pour limiter ce
problème avec les macros, qui profite de deux décennies de contributions
d'auteurs divers.
Voici un exemple de programmation avec des
macros.
Le code 100% assembleur:
- Code:
section data:
String1 db "Hello !",0
String2 db "Message",0
section code:
push NULL
push offset String2
push offset String1
push NULL
call MessageBox
Ce code inclus dans un
programme va afficher une MessageBox (une petite fenêtre) avec le
contenu "Hello !" et la note "Message" en entête.
Nous pouvons
résumer tout ce code en une seule ligne avec Masm32. Autrement dit, cela
permet au développeur de coder en une ligne l'équivalent de sept lignes
en langage pur asm. Un langage de haut niveau ne pourrait faire mieux !
- Code:
fn MessageBox,0,"Hello !","Message",0
Explication: la macro "fn" va
créer elle-même les chaîne de caractère "Hello !" et "Message", qui
seront ajoutées automatiquement dans la section "data" lors de la
compilation. Cela nous évite de les déclarer dans cette section. La
macro "fn" va ensuite les placer dans le bon odre avant d'appeler l'API
"MessageBox". Le code résultant dans le programme compilé sera pourtant
identique au code 100% asm.
L'utilisation de telles macros est
l'option possible à utiliser lorsque l'on entame des projets avec des
GUI (interfaces Windows) ou en utilisant des API (Application and
Programming Interface), puisque même si un code pur asm serait un peu
plus rapide qu'un code C l'utilisateur n'y verrait absolument AUCUNE
différence, la vitesse d'exécution étant compromise par les limitations
de l'interface utilisateur de Windows.
La très grande majorité
des sources disponibles en assembleur concernent les approches 1 et 2
parce qu'il s'agit souvent de petits projets, le programmeur peut alors
se permettre un code puriste, ou parce qu'il s'agit de procédures ou de
fonctions qui sont optimisées. C'est évidemment en cela que se trouve le
plus grand intérêt de coder en langage assembleur.
Alors à quoi
bon utiliser l'assembleur si c'est pour utiliser des fonctions et macros
de haut niveau me direz-vous ?
Je résumerai l'intérêt de cette
approche en trois points:
1. Tout d'abord il faut bien comprendre
qu'utiliser des fonctions et des macros de haut niveau ne fera
absolument pas chuter les performances de votre programme.
2.
Faciliter le développement de projets lourds en luttant à armes à peu
près égales avec un codeur C par exemple (concernant le C++ c'est
sûrement trop présomptueux de ma part, j'en reste donc à la comparaison
avec le langage C dont j'ai des notions correctes). Pourquoi faire
compliqué quand on peut faire simple ? En commençant avec un codage plus
haut niveau vous pourrez mettre en place plus rapidement votre projet,
ce en quoi se trouve l'intérêt des langages de haut niveau. Hé bien nous
allons - suffisamment - marcher sur leurs platebandes. Il sera toujours
possible d'optimiser très fortement votre code par la suite, en
remplaçant une variable par un registre par exemple, ce que vous ne
pourrez pas faire dans un autre langage, en tout cas de manière aussi
simple et aisée qu'avec le langage assembleur qui vous met tout à
disposition directe. Que demande le peuple ?
3. Cette approche va
vous permettre de vous jeter plus facilement dans le bain de la
programmation assembleur. Vous n'aurez pas besoin de larges
connaissances dans ce langage pour débuter; par exemple seul le registre
EAX sera véritablement utile lorsque vous mettrez en place vos premiers
programmes avec des API Windows. A vous, ensuite, d'élargir votre champ
d'action.
L'idée sous-jacente de ces tutoriels est
de montrer que l'assembleur n'est pas forcément compliqué, difficile à
coder et à lire, en aidant le nouveau venu à utiliser le meilleur du
langage haut niveau et le meilleur du langage assembleur dans un seul et
même projet.
La théorie du langage assembleur sera
abordée progressivement, au fur et à mesure de nos exemples et de
manière empirique. Rien ne vous empêche de réviser les bases théoriques
de l'assembleur avant de commencer, cela est même conseillé. Il existe
beaucoup d'aide disponible sur internet sur ce sujet.
Juillet 2010 - Faiseur
0 commentaires:
Enregistrer un commentaire