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 :

[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

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 !