Je suis assez nouveau sur Linux (Ubuntu 10.04) et novice dans l'assembleur. Je suivais quelques tutoriels et je ne trouvais rien de spécifique à Linux ..__ Donc, ma question est: quel est le bon paquet pour compiler/exécuter un assembleur et quelles sont les commandes en ligne de commande pour compiler/exécuter ce paquet?
L'assembleur GNU (gaz) et les MSNA sont tous deux de bons choix. Cependant, ils ont quelques différences, la plus importante étant l'ordre dans lequel vous placez les opérations et leurs opérandes.
gas utilise la syntaxe AT & T (guide: https://stackoverflow.com/tags/att/info ):
mnemonic source, destination
nasm utilise le style Intel (guide: https://stackoverflow.com/tags/intel-syntax/info ):
mnemonic destination, source
Soit on fera probablement ce dont vous avez besoin. GAS a également un mode de syntaxe Intel, qui ressemble beaucoup à MASM, pas à NASM.
Essayez ce tutoriel: http://asm.sourceforge.net/intro/Assembly-Intro.html
Voir aussi plus de liens vers des guides et des documents dans Stack Overflow's x86 tag wiki
L'assembleur GNU est probablement déjà installé sur votre système. Essayez man as
pour voir toutes les informations d'utilisation. Vous pouvez utiliser as
pour compiler des fichiers individuels et ld pour créer un lien si vous le souhaitez vraiment.
Cependant, GCC est une excellente interface. Il peut assembler des fichiers .s pour vous. Par exemple:
$ cat >hello.s <<"EOF"
.section .rodata # read-only static data
.globl hello
hello:
.string "Hello, world!" # zero-terminated C string
.text
.global main
main:
Push %rbp
mov %rsp, %rbp # create a stack frame
mov $hello, %edi # put the address of hello into RDI
call puts # as the first arg for puts
mov $0, %eax # return value = 0. Normally xor %eax,%eax
leave # tear down the stack frame
ret # pop the return address off the stack into RIP
EOF
$ gcc hello.s -no-pie -o hello
$ ./hello
Hello, world!
Le code ci-dessus est x86-64. Si vous voulez créer un exécutable indépendant de la position (PIE), vous aurez besoin de lea hello(%rip), %rdi
et call puts@plt
.
Un exécutable non-PIE (position -dépendante) peut utiliser un adressage absolu sur 32 bits pour les données statiques, mais un PIE doit utiliser une LEA relative RIP. (Voir aussi La différence entre movq et movabsq dans x86-64 ni movq
ni movabsq
sont un bon choix.)
Si vous voulez écrire du code 32 bits, la convention d'appel est différente et l'adressage relatif au RIP n'est pas disponible. (Donc, vous devriez Push $hello
avant l'appel, et sautez la pile après.)
Vous pouvez également compiler le code C/C++ directement dans Assembly si vous êtes curieux de savoir comment quelque chose fonctionne:
$ cat >hello.c <<EOF
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
EOF
$ gcc -S hello.c -o hello.s
Voir aussi Comment supprimer le "bruit" de la sortie GCC/clang Assembly? pour plus d'informations sur la sortie du compilateur et l'écriture de petites fonctions utiles permettant de compiler une sortie intéressante.
Si vous utilisez NASM, la ligne de commande est juste
nasm -felf32 -g -Fdwarf file.asm -o file.o
où 'file.asm' est votre fichier d'assemblage (code) et 'file.o' est un fichier objet que vous pouvez lier avec gcc -m32
ou ld -melf_i386
. (L'assemblage avec nasm -felf64
crée un fichier objet 64 bits, mais l'exemple hello world ci-dessous utilise des appels système 32 bits et ne fonctionne pas dans un exécutable PIE.)
Voici quelques informations supplémentaires:
http://www.nasm.us/doc/nasmdoc2.html#section-2.1
Vous pouvez installer NASM dans Ubuntu avec la commande suivante:
apt-get install nasm
Voici un assemblage de base de Hello World dans Linux pour vous mettre en appétit:
http://web.archive.org/web/20120822144129/http://www.cin.ufpe.br/~if817/arquivos/asmtut/index.html
J'espère que c'est ce que vous demandiez ...
Il existe également FASM pour Linux.
format ELF executable
segment readable executable
start:
mov eax, 4
mov ebx, 1
mov ecx, hello_msg
mov edx, hello_size
int 80h
mov eax, 1
mov ebx, 0
int 80h
segment readable writeable
hello_msg db "Hello World!",10,0
hello_size = $-hello_msg
Il comile avec
fasm hello.asm hello
Ma suggestion serait d’obtenir le livre Programming From Ground Up:
http://nongnu.askapache.com/pgubook/ProgrammingGroundUp-1-0-booksize.pdf
C’est un très bon point de départ pour entrer dans la programmation d’assembleurs sous linux et cela explique de nombreux principes de base que vous devez comprendre pour commencer.
L'assembleur (GNU) est as (1)
3 syntaxe (nasm, tasm, gas) dans 1 assembleur, yasm.
Pour Ubuntu 18.04 installnasm
. Ouvrez le terminal et tapez:
Sudo apt install as31 nasm
nasm docs
Pour compiler et exécuter:
nasm -f elf64 example.asm # assemble the program
ld -s -o example example.o # link the object file nasm produced into an executable file
./example # example is an executable file