blog/_posts/2016-12-09-programmer-en-na...

5.4 KiB

title date url layout category
Programmer en NASM x86 (Linux 64 bits) - ASM 2016-12-09 programmer-en-nasm-sous-linux-64-bits-asm post Programming

A missing blog post image

Bon, here we are, 48 heures plus tard, une petite procédure pour programmer facilement sous un Linux 64 bits en NASM.

Pourquoi tant de temps ? Parce que :

  1. plus personne ne fait ça

  2. la moitié des pages web traitant de ce sujet ne répondent plus

  3. parce que quand même, si GDB était encore compatible avec NASM, ça aurait été trop simple

  4. Il a d'abord fallu attendre que Visual C++ se lance, plante et s'arrête, accompagné de 2 redémarrages de Windows intrusifs :trollface:

Commençons par installer les dépendances (procédure pour Debian ici) :

# apt install nasm gdb

Maintenant je vous propose de vous baser sur ce programme exemple que j'ai adapté (de la documentation officielle qui date de 1997 quand même !).

Une fois copié dans un fichier :

$ nasm -f elf64 -g helloWorld.asm
$ ld -m elf_x86_64 -g -o helloWorld helloWorld.o
$ ./helloWorld

... et si vous désirez debugger votre code :

$ gdb ./helloWorld


Un autre moyen pour vous serez de passer par un IDE développé de façon indépendante, SASM.
Pour l'utiliser, rendez-vous sur cette page et téléchargez-y l'archive qui correspond à votre système.

Une fois installé, récupérez mon fichier de configuration ci-dessous, et copiez-le dans votre ~/.config/SASM\ Project/SASM.conf :

{% highlight ini %} [General] language=1 starttext=";\n;\n;\n\n\nsection .data\n\nsection .bss\n\nsection .text\n\n global _start\n\n_start:\n\n mov eax, 1\n mov ebx, 0\n int 0x80\n" backgroundcolor=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) keywordscolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) registerscolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) numberscolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) memorycolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) labelscolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) commentscolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) systemcolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) iomacrocolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) quotationcolorbg=@Variant(\0\0\0\x43\x1\xff\xff++++++\0\0) startwindow=1 allregisters=true insertdebugstring=true fontfamily=Courier New fontsize=12 assemblyoptions=-g -f elf64 SOURCE -l LSTOUTPUT -o $PROGRAM.OBJ$ linkingoptions=PROGRAM.OBJ -g -o $PROGRAM$ objectfilename=program.o disablelinking=false assemblerpath=nasm linkerpath=ld tabgeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x5Q\0\0\x1\xe5\0\0\0\0\0\0\0\0\0\0\x5Q\0\0\x1\xe5\0\0\0\0\0\0) tabwindowstate=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\x1\x12\0\0\x1\xe6\xfc\x2\0\0\0\x2\xfb\0\0\0\x12\0i\0n\0p\0u\0t\0\x44\0o\0\x63\0k\x1\0\0\0\0\0\0\x1\xe6\0\0\0|\0\xff\xff\xff\xfb\0\0\0\x14\0o\0u\0t\0p\0u\0t\0\x44\0o\0\x63\0k\x3\0\0\x4\x42\0\0\x1l\0\0\x1\x12\0\0\0\xec\0\0\x4:\0\0\x1\xe6\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) mode=x64 currentlinemode=false fontcolor=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0) linenumberfontcolor=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0) windowstate=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\0\0\0\x5V\0\0\x2\x90\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x4\0\0\0\b\0\x46\0i\0l\0\x65\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0\x45\0\x64\0i\0t\x1\0\0\0y\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0\x42\0u\0i\0l\0\x64\x1\0\0\x1:\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0\x44\0\x65\0\x62\0u\0g\x1\0\0\x1\xb3\xff\xff\xff\xff\0\0\0\0\0\0\0\0) tabscount=0 saveopendirectory=/home/horlogeskynet/GDrive/Scolaire/3A - INSA/Prog_ASM/TD3 logsplitterstate=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x2\0\0\x1\xe6\0\0\0w\x1\0\0\0\x6\x1\0\0\0\x2) labelscolor=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\0\0\0\0\0\0) commentscolor=@Variant(\0\0\0\x43\x1\xff\xff\0\0\xff\xff\0\0\0\0) systemcolor=@Variant(\0\0\0\x43\x1\xff\xff\0\0\xff\xff\xff\xff\0\0) memorycolor=@Variant(\0\0\0\x43\x1\xff\xff\0\0\x80\x80\xff\xff\0\0) currentlinecolor=@Variant(\0\0\0\x43\x1\xff\xff\xaa\xaa\xaa\xaa\x7f\x7f\0\0) iomacrocolor=@Variant(\0\0\0\x43\x1\xff\xff\0\0UU\xff\xff\0\0) registerscolor=@Variant(\0\0\0\x43\x1\xff\xff\xbf\xbf\0\0\xff\xff\0\0) keywordscolor=@Variant(\0\0\0\x43\x1\xff\xff\0\0UU\xff\xff\0\0) assembler=NASM debugregisters=false debugmemory=false debugstate=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\0\0\0\x5V\0\0\x2\x90\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x4\0\0\0\b\0\x46\0i\0l\0\x65\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0\x45\0\x64\0i\0t\x1\0\0\0y\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0\x42\0u\0i\0l\0\x64\x1\0\0\x1:\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0\x44\0\x65\0\x62\0u\0g\x1\0\0\x1\xb3\xff\xff\xff\xff\0\0\0\0\0\0\0\0) [MainWindow] size=@Size(1366 716) pos=@Point(0 0) maximized=2 {% endhighlight %}

Procédure de test : créez un nouveau projet et collez-y ce même programme dans l'éditeur de SASM, puis lancez une exécution et un debuggage afin de vérifier que les opérations fonctionnent !