Apprendre à programmer en Assembleur avec Visual C++

CGi

Le but de ce tutoriel est de vous apprendre à programmer en langage Assembleur avec l'EDI Visual C++.

Pour réagir au contenu de ce tutoriel, un espace de dialogue vous est proposé sur le forum.

Commentez

- Titre : Apprendre à programmer en Assembleur avec Visual C++

- Auteur : CGi

- Parution : 14 février 2016

- Licence : Copyright ® 2016 CGi. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Le mode opératoire

- III. Conclusion et remerciements

I - Introduction

J'ai fait ce tutoriel pour vous montrer que l'on peut faire une application 100 % en Assembleur(x86) avec Visual C++.
Visual C++ est en fait livré avec MASM, le macro assembleur de Microsoft et qui plus est, dans sa dernière version. Avec donc les toutes dernières instructions des derniers microprocesseurs. Vous n'avez donc rien à installer (à part Visual C++ bien sûr). Ce n'est pas génial tout cela. Le mode opératoire de ce tutoriel sera basé sur Visual C++ express 2010.

II - Le mode opératoire

Après avoir ouvert l'EDI de Visual C++, vous devrez créer un projet vide.
Dans le dossier du projet, vous devrez créer un fichier texte, que l'on va nommer « main.asm » (on aurait très bien pu lui donner un autre nom).

Ensuite, dans l'explorateur de solutions de Visual C++, faites un clic droit sur le projet, et dans le menu contextuel sélectionnez « Ajouter » puis « Élément existant ».

Ce qui nous ouvre une boîte de dialogue d'ouverture de fichier. Vous sélectionnez le fichier « main.asm » précédemment créé et faites « Ajouter ». Le fichier fait dorénavant partie du projet et est bien présent dans l'explorateur de solution de Visual C++.

Ce n'est pas terminé, il nous faut apporter des informations supplémentaires de configuration pour appeler masm et pour l'édition des liens.

Pour cela, dans l'explorateur de solutions, faites un clic droit sur le fichier « main.asm » puis, dans le menu contextuel, cliquez sur « propriétés ». Cela ouvre la fenêtre de propriétés du fichier.

Ensuite, dans la page de propriétés, sélectionnez « Général » dans l'arborescence, et positionnez la propriété « Type d'élément » à « Outil de génération personnalisé ». Ensuite, faites « Appliquer », ce qui a pour effet de rouvrir la page de propriétés avec des options supplémentaires.

Dans l'arborescence de la page de propriétés, sélectionnez « Outil de génération personnalisé » puis « Général ».

Dans cette section nous allons modifier deux propriétés :

- « Ligne de commande » avec : ml /c /coff « main.asm » (c'est la ligne de commande pour assembler main.asm avec masm) ;

- « Sortie » avec main.obj (c'est le nom du fichier de sortie à envoyer à l'éditeur de liens).

Validez les modifications par le bouton « Ok ».

Je vous mets un petit code pour vos tests. Ce code fait appel à deux fonctions de la libc, « puts » et « printf ».

Ces deux fonctions nécessitent d'ajouter la bibliothèque « msvcrt.lib » dans les dépendances du projet (option de l'éditeur de lien).

1. .386

2. .model flat, C

4. EXTRN   _imp__puts:PROC

5. EXTRN   _imp__printf:PROC

7. .data

9. Ch1 DB 10, 'Hello !', 10, 0

10. Ch2 DB 'Le chiffre %d', 10, 10, 0

12. .code

14. main    PROC

16. push OFFSET Ch1

17. call DWORD PTR _imp__puts

18. pop eax

20. push 100

21. push OFFSET Ch2

22. call DWORD PTR _imp__printf

23. add     esp, 8

25. xor     eax, eax

26. ret

28. main    ENDP

30. END

Vous pouvez dorénavant générer votre projet et main.asm sera assemblé par masm et le fichier .obj lié comme si cela était un fichier C ou C++.

Les messages d'erreur s'affichent dans la fenêtre de sortie comme pour un fichier C ou C++.

Faire un programme 100 % assembleur est d'un autre temps, par contre vous pouvez utiliser le même principe pour faire une bibliothèque de fonctions écrite en assembleur.

Bonne lecture,

CGi.

III - Conclusion et remerciements

Nous tenons à remercier FRANOUCH pour la relecture orthographique et Malick SECK pour la mise au gabarit.