web-dev-qa-db-fra.com

Compiler/exécuter un assembleur sous Linux?

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?

53
Rafe Kettler

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

43
George

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.

55
Jay Conrod

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 ...

20
Justin

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
8
Artur Artamonov

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.

7
gilligan

L'assembleur (GNU) est as (1)

4
Recursion

3 syntaxe (nasm, tasm, gas) dans 1 assembleur, yasm.

http://www.tortall.net/projects/yasm/

3
plan9assembler

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
0
Geancarlo Murillo