Compiler un programme assembleur avec Nasm

Décembre 2016





Nasm est un logiciel assembleur libre pour architecture x86. On peut le trouver pour plusieurs systèmes d'exploitation comme Linux ou Windows par exemple.
Un assembleur permet d'assembler du code assembleur. (sic)

Hélas, assembleur signifie deux choses
  • le langage "assembleur" qui permet de programmer en langage machine à partir de mnémoniques
  • le logiciel qui va transformer votre code en langage machine directement compréhensible par votre processeur.


Cette astuce ne vous apprendra pas à programmer avec Nasm mais à créer un executable sous Linux et Windows à partir d'un code source destiné à Nasm.

Avec Linux


Etape 1. Créer un fichier source


Vous n'avez pas besoin d'un éditeur spécifique pour créer un fichier source destiné à Nasm. Vous pourriez éventuellement utiliser un éditeur qui supporte la coloration syntaxique de l'assembleur mais il n'y en a pas, à ma connaissance, qui supporte la syntaxe de nasm.
Vous pouvez donc choisir gedit, kwrite, xemacs etc...

Lorsque vous enregistrez votre fichier source, donnez lui l'extension .asm

Etape 2. Assembler le fichier source


Pour cette étape, vous aurez besoin du logiciel nasm installé sur votre machine. Si vous êtes sous Debian ou Ubuntu, il suffit de taper la commande
sudo apt-get install nasm


Si vous avez une autre distribution Linux, il vous faudra utiliser le gestionnaire de paquet de votre distribution (exemple urpmi, yum, emerge etc...) ou bien compiler nasm en téléchargeant l'archive depuis le site officiel.

Passons maintenant à l'assemblage de votre fichier source.
Rendez vous en ligne de commande dans le repertoire ou se situe votre fichier source que nous allons appeler test.asm pour l'exemple. Voici la ligne à taper:
nasm -f elf test.asm

Ceci créera un fichier nommé test.o dans le repertoire courant. Ce fichier n'est pas encore exécutable, ce n'est encore qu'un fichier objet, c'est à dire un fichier qu'il faut lier avec les bibliothèques dont il dépend comme par exemple la libraire standard libc.

Etape 3. Création de l'executable


Maintenant que nous avons notre fichier objet nommé test.o nous allons créer notre executable.
Deux cas se présentent ici:
  • Votre programme débute avec une procédure nommée "_start". Celà signifie que votre programme possède son propre point d'entrée sans utiliser de fonction main. Ca ne change pas grand chose, toutefois vous aurez besoin d'utiliser la commande "ld" pour créer votre executable:

ld test.o -o test
  • Votre programme débute avec une procédure nommée "main". Vous aurez donc besoin d'utiliser gcc pour créer votre executable:

gcc test.o -o test


Voilà notre executable est créé, il s'appelle test et se situe dans le repertoire courant.

Etape 4. Execution du programme


Pour executer notre programme appellé "test", il suffit de taper cette commande:
./test

Vous pouvez également utiliser un déboggeur pour observer l'execution. Pour celà vous pouvez utiliser gdb qui s'utilise en ligne de commande. Si toutefois vous voulez un débogeur plus visuel, il existe des interfaces graphiques qui utilisent gdb en arrière plan comme par exemple Insight.

Avec windows


IMPORTANT: Sous windows la convention d'appel de paramètre n'est pas la même, la fonction appellée doit nettoyer elle-même la pile. De même, le main n'existe pas sous windows, il faut le remplacer par WinMain.
Si votre point d'entrée est _start ou main, il faudra changer celà en "_WinMain@16" et changer le "ret" à la fin de cette procédure d'entrée en "ret 16".
Exemple d'un fichier source correct sous Windows:
section .text
	global _WinMain@16

_WinMain@16:
	mov eax, 0
	ret 16	

Etape 1. Installer les logiciels nécessaires


Nous allons d'abord installer nasm. Allez sur la section de téléchargement de CCM où bien sur le site officiel dans la section download (choisissez la version Win32 binaries). Gardez l'archive dans un coin, on s'en servira plus tard.

L'étape la plus délicate va être d'installer MingW qui est un environnement de développement libre pour windows.
A cette adresse, choisissez la dernière version de MinGW. Aujourd'hui c'est la version 5.0.0.
Executez cet installeur. S'il vous propose de mettre à jour votre installeur dés le début, dites non. Laissez toutes les options selectionnées par défaut puis attendez la fin de l'installation.

A présent, nous allons insérer nasm dans l'environnement de développement MingW, comme des sauvages mais avec de la délicatesse.
Décompressez l'archive de nasm, vous devriez obtenir un dossier contenant, entre autres, un fichier nommé nasm.exe
Copiez ce fichier dans le repertoire C:\MinGW\bin

Etape 2. Créer un fichier source


Tout comme pour Linux, il n'y a pas besoin d'utiliser un éditeur spécifique pour créer un fichier source destiné à Nasm.
Vous pouvez utiliser par exemple le Bloc Note mais faites attention, le bloc note de windows a tendance à rajouter l'extension .txt au fichiers qu'il crée. Pour lever toute ambiguité, je vous recommande chaudement d'afficher les extensions de vos fichiers.
Evitez en tout cas des traitements de textes comme Word ou WordPad qui risquent d'enregistrer votre fichier dans un format indésirable.

Si vous le souhaitez, vous pouvez également utiliser un éditeur qui utilise la coloration syntaxique pour la syntaxe de nasm comme par exemple NasmEdit IDE (gratuit).

Dans tous les cas, je vous conseille de donner l'extension .asm à votre fichier source.

Etape 3. Assembler le fichier source


Ouvrez l'interpréteur de commande de windows (tapez cmd.exe dans "Executer" du menu démarrer ou directement "cmd" dans la barre "recherche" du logo windows sous Windows Vista.
Avec cet interpréteur de commande, vous devrez vous rendre dans le dossier qui contient votre fichier source avec la commande "cd".
Une fois que vous êtes dans ce repertoire, assemblez votre fichier source (appellons le test.asm) avec cette commande:
nasm -f win32 test.asm -o test.o

Vous avez à présent un fichier objet qui n'est pas encore executable, mais il le sera bientôt, passons à la dernière étape.

Etape 4. Création et execution du programme


Toujours depuis votre fenêtre de commande, une dernière commande à taper pour créer l'executable:
ld test.o -o test.exe

Si vous avez un problème avec cette commande, c'est que vous avez peut être oublié le lire le point important que j'ai noté plus haut au début de la section "Pour Windows".
Pour tester votre executable, tapez simplement "test" dans la fenêtre de commande. Si vous voulez un debugger pour visualiser de plus près ce qui se passe, utilisez OllyDbg, c'est un excellent debuggeur.

A voir également :

Ce document intitulé «  Compiler un programme assembleur avec Nasm  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.