Développer en langage assembleur: Introduction
:: Boîte à outils :: Tutoriels
Page 1 sur 1 • Partager •
Développer en langage assembleur: Introduction
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.

faiseur- Admin
- Messages: 371
Date d'inscription: 02/05/2010

Re: Développer en langage assembleur: Introduction
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
Pas d'accord.
Juste un exemple :
INVOKE MessageBox,NULL,ADDR szStr1,ADDr szStr2,NULL
JMP Eoj
Un call suivi d'un jump doit être remplacé par un PUSH OFFSET Eoj suivi d'un JUMP MessageBox
Je ne parle pas de la version 64 bits ou c'est encore pire.

Grincheux- Messages: 247
Date d'inscription: 17/05/2010
Age: 52
Localisation: Mathenay (39), France

Sujets similaires» ZBrush 2 : Introduction
» Langage Objet - static
» [RPG] Comment développer et bien présenter vos RPs
» introduction au web 3D
» Pour les vrais débutants en programmation
» Langage Objet - static
» [RPG] Comment développer et bien présenter vos RPs
» introduction au web 3D
» Pour les vrais débutants en programmation
:: Boîte à outils :: Tutoriels
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum




