99 lines
5.4 KiB
Markdown
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 !
|