it-swarm.com.de

Compiler in Linux kompilieren/ausführen?

Ich bin relativ neu in Linux (Ubuntu 10.04) und ein absoluter Neuling in Assembler. Ich habe ein paar Tutorials verfolgt und konnte keine Linux-spezifischen Dinge finden .. __ Meine Frage ist also: Was ist ein gutes Paket zum Kompilieren/Ausführen von Assembler und welche Befehlszeilenbefehle müssen für dieses Paket kompiliert/ausgeführt werden?

53
Rafe Kettler

Der GNU - Assembler (Gas) und NASM sind beide eine gute Wahl. Sie weisen jedoch einige Unterschiede auf. Die große Reihenfolge ist die Reihenfolge, in der Sie Operationen und ihre Operanden ablegen.

gas verwendet AT & T-Syntax (Anleitung: https://stackoverflow.com/tags/att/info ):

mnemonic    source, destination

nasm verwendet den Intel-Stil (guide: https://stackoverflow.com/tags/intel-syntax/info ):

mnemonic    destination, source

Entweder wird einer das tun, was Sie brauchen. GAS verfügt auch über einen Intel-Syntaxmodus, der MASM und nicht NASM ähnelt.


Probieren Sie dieses Tutorial aus: http://asm.sourceforge.net/intro/Assembly-Intro.html

Siehe auch weitere Links zu Handbüchern und Dokumenten im x86-Tag-Wiki von Stack Overflow

43
George

Der Assembler GNU ist wahrscheinlich bereits auf Ihrem System installiert. Versuchen Sie man as, um vollständige Nutzungsinformationen anzuzeigen. Sie können as verwenden, um einzelne Dateien zu kompilieren, und ld kann verlinkt werden, wenn Sie wirklich wollen.

GCC ist jedoch ein hervorragendes Frontend. Es kann .s-Dateien für Sie zusammenstellen. Zum Beispiel:

$ 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!

Der obige Code lautet x86-64. Wenn Sie eine positionsunabhängige ausführbare Datei (PIE) erstellen möchten, benötigen Sie lea hello(%rip), %rdi und call [email protected].

Eine nicht-PIE-ausführbare Datei (Position -abhängig) kann für statische Daten eine absolute 32-Bit-Adressierung verwenden, eine PIE sollte jedoch RIP-relative LEA verwenden. (Siehe auch Unterschied zwischen movq und movabsq in x86-64 weder movq noch movabsq sind eine gute Wahl.)

Wenn Sie 32-Bit-Code schreiben möchten, unterscheidet sich die Aufrufkonvention, und die RIP-relative Adressierung ist nicht verfügbar. (Sie würden also vor dem Aufruf Push $hello eingeben und die Stack-Argumente nach dem Popup öffnen.)


Sie können den C/C++ - Code auch direkt in Assembly kompilieren, wenn Sie wissen möchten, wie etwas funktioniert:

$ cat >hello.c <<EOF
#include <stdio.h>
int main(void) {
    printf("Hello, world!\n");
    return 0;
}
EOF
$ gcc -S hello.c -o hello.s

Siehe auch Wie entferne ich "Rauschen" von der GCC/clang Assembly-Ausgabe? für mehr darüber, wie Sie die Compilerausgabe betrachten und nützliche kleine Funktionen schreiben, die zu interessanten Ausgaben kompilieren.

55
Jay Conrod

Wenn Sie NASM verwenden, ist die Befehlszeile nur

nasm -felf32 -g -Fdwarf file.asm -o file.o

dabei ist 'file.asm' Ihre Assembly-Datei (Code) und 'file.o' eine Objektdatei, die Sie mit gcc -m32 oder ld -melf_i386 verknüpfen können. (Beim Zusammenfügen mit nasm -felf64 wird eine 64-Bit-Objektdatei erstellt. Das Beispiel für die Hello-Welt verwendet jedoch 32-Bit-Systemaufrufe und funktioniert in einer PIE-Programmdatei nicht.)

Hier sind einige weitere Infos:

http://www.nasm.us/doc/nasmdoc2.html#section-2.1

Sie können NASM mit dem folgenden Befehl in Ubuntu installieren:

apt-get install nasm

Hier ist eine grundlegende Hello World in Linux Assembly, um Ihren Appetit zu wecken:

http://web.archive.org/web/20120822144129/http://www.cin.ufpe.br/~if817/arquivos/asmtut/index.html

Ich hoffe, das ist es, was Sie gefragt haben ...

20
Justin

Es gibt auch FASM für 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

Es kommt mit

fasm hello.asm hello
8
Artur Artamonov

Mein Vorschlag wäre, das Buch Programmieren von Grund auf zu erhalten:

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

Dies ist ein sehr guter Ausgangspunkt, um in die Assembler-Programmierung unter Linux einzusteigen, und es werden viele Grundlagen erläutert, die Sie für den Einstieg benötigen.

7
gilligan

Der Assembler (GNU) ist als (1)

4
Recursion

3 Syntax (Nasm, Tasm, Gas) in 1 Assembler, Yasm.

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

3
plan9assembler

Für Ubuntu 18.04 installnasm. Öffnen Sie das Terminal und geben Sie Folgendes ein:

Sudo apt install as31 nasm

nasm docs

Zum Kompilieren und Laufen:

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