57 votes

Compiler/exécuter l'assembleur sous Linux ?

Je suis assez nouveau sur Linux (Ubuntu 10.04) et totalement novice en assembleur. J'ai suivi quelques tutoriels et je n'ai rien trouvé de spécifique à Linux. Donc, ma question est la suivante : quel est un bon paquetage pour compiler/exécuter l'assembleur et quelles sont les commandes de ligne de commande à compiler/exécuter pour ce paquetage ?

0 votes

Je suis dans le même bateau. Je n'ai jamais vraiment pris l'asm sur Linux parce qu'il n'y a pas de réelle présence. C'est peut-être parce que sous Windows, le cracking fait fureur.

0 votes

Ils ne répondent pas complètement à ma question. Je veux toujours savoir quelles commandes de la console vous utiliseriez pour compiler et exécuter des programmes dans NASM ou gaz.

0 votes

Ma préférence va au NASM. Je vous donne quelques informations sur la façon de le mettre en place et de le faire fonctionner sur Ubuntu ci-dessous.

59voto

Jay Conrod Points 12375

L'assembleur GNU est probablement déjà installé sur votre système. Essayez man as pour voir les informations complètes sur l'utilisation. Vous pouvez utiliser as pour compiler les fichiers individuels et ld pour les lier si vous le voulez vraiment, vraiment.

Cependant, GCC est un excellent frontal. 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 faire un exécutable indépendant de la position (PIE), il vous faut lea hello(%rip), %rdi et call puts@plt .

Un exécutable non-PIE (position- dépendant ) peut utiliser l'adressage absolu 32 bits pour les données statiques, mais un PIE doit utiliser le RIP-relatif LEA. (Voir également Différence entre movq et movabsq en 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 RIP n'est pas disponible. (Donc vous push $hello avant l'appel, et pop les args de la pile après).


Vous pouvez également compiler du code C/C++ directement en assembleur 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 de l'assemblage GCC/clang ? pour en savoir plus sur l'examen de la sortie du compilateur et l'écriture de petites fonctions utiles qui compileront vers une sortie intéressante.

47voto

George Points 1278

L'assembleur GNU (gas) et NASM sont deux 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

L'un ou l'autre fera probablement ce dont vous avez besoin. GAS dispose également d'un mode syntaxe Intel, qui ressemble beaucoup à MASM, et non à NASM.


Essayez ce tutoriel : http://asm.sourceforge.net/intro/Assembly-Intro.html

Vous trouverez également d'autres liens vers des guides et des documents dans la rubrique "Stack Overflow". wiki des tags x86

1 votes

Merci, ce tutoriel est génial car il est spécifique à linux. De plus, ce tutoriel contient des instructions très précises sur la façon de compiler et d'exécuter des programmes en assembleur sous Linux.

1 votes

Gas supporte ".intel_syntax" depuis un certain temps - personnellement, j'utiliserais toujours fasm, yasm ou nasm.

20voto

Justin Points 5321

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 à l'application. gcc -m32 ou ld -melf_i386 . (Assemblage avec nasm -felf64 fera un fichier objet 64 bits, mais l'exemple hello world ci-dessous utilise des appels système 32 bits, et ne fonctionnera 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 Hello World basique en assembleur 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...

0 votes

L'exemple de Hello World est un lien brisé !

8voto

Artur Artamonov Points 31

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 compile avec

fasm hello.asm hello

7voto

gilligan Points 556

Je vous conseille de vous procurer le livre Programming From Ground Up :

http://nongnu.askapache.com/pgubook/ProgrammingGroundUp-1-0-booksize.pdf

Il s'agit d'un très bon point de départ pour se lancer dans la programmation en assembleur sous Linux et il explique une grande partie des bases que vous devez comprendre pour commencer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X