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?
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
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.
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 ...
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
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.
Der Assembler (GNU) ist als (1)
3 Syntax (Nasm, Tasm, Gas) in 1 Assembler, Yasm.
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