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

99 lines
5.4 KiB
Markdown

---
title: "Programmer en NASM x86 (Linux 64 bits) - ASM"
date: 2016-12-09
url: programmer-en-nasm-sous-linux-64-bits-asm
layout: post
category: Programming
---
[![A missing blog post image](/img/blog/programmer-en-nasm-sous-linux-64-bits-asm.png)](/img/blog/programmer-en-nasm-sous-linux-64-bits-asm.png)
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](https://gist.github.com/HorlogeSkynet/eff0a7e307809c1b661a87d88bd33f21) 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](https://dman95.github.io/SASM/english.html).
Pour l'utiliser, rendez-vous sur [cette page](http://download.opensuse.org/repositories/home:/Dman95/) 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](https://gist.github.com/HorlogeSkynet/eff0a7e307809c1b661a87d88bd33f21) dans l'éditeur de SASM, puis lancez une exécution et un debuggage afin de vérifier que les opérations fonctionnent !