GNU Assembler
| GNU Assembler | |
|---|---|
| Basisdaten | |
| Entwickler | GNU-Projekt |
| Erscheinungsjahr | 1986 |
| Aktuelle Version | toolset version of binutils[1] |
| Betriebssystem | systemübergreifend |
| Programmiersprache | C |
| Kategorie | Assembler |
| Lizenz | GNU General Public License v3 |
| www.gnu.org/software/binutils | |
Der GNU Assembler, auch bekannt als GAS, ist der Assembler des GNU-Projekts. Er ist das Standard-Backend der GNU Compiler Collection und wird folglich zum Assemblieren des Betriebssystems GNU, des Linux-Kernels und vieler anderer insbesondere als Quelltextpakete verfügbarer Applikationen verwendet. Er gehört zu den GNU Binary Utilities (binutils).[2]
Die ausführbare Datei des GNU Assemblers wird wie der Assembler des ursprünglichen Unix von AT&T und Assembler späterer Unix-artiger Betriebssysteme[3][4] mit as aufgerufen. GAS ist plattformübergreifend und damit für eine große Anzahl von Rechnerarchitekturen sowohl lauf- als auch assemblierfähig. Als üblicher Assembler für die GCC ist er in u. a. vielen Linux-Distributionen[5] und einigen BSD-Abkömmlingen[6] enthalten.
GAS wird unter der GNU General Public License v3 veröffentlicht und ist freie Software.
Kompatibilität
[Bearbeiten | Quelltext bearbeiten]Für gängige Mikroprozessorarchitekturen wie AArch64,[7] IBMs (bzw. AIMs) Enhanced RISC (IBM POWER und PowerPC) und x86[8] ab dem 80386[9] (dazu s. Abschnitt) ist der GNU Assembler nativ vorkompiliert erhältlich. Als Cross-Assembler etwa für vergleichsweise leistungsschwache oder veraltete Prozessoren wie die M68000er Familie oder den Z80 muss er in vielen Fällen mit den geeigneten Werkzeugen aus Quellen in der Archivdatei, mit der die binutils veröffentlicht werden, erstellt werden; wobei abhängig von Betriebssystem, CPU und Assemblierungsziel (namentlich dem sehr bekannten Z80)[10] auch (ältere) binutils-Pakete fertig angeboten werden.
Der dem Betriebssystem eigene Assembler ist in der Shell gewöhnlich als /usr/bin/as über den voreingestellten Suchpfad aufrufbar (s. auch Filesystem Hierarchy Standard). Zusätzliche binutils werden gewöhnlich als /usr/binutils-<Zielrechner> angelegt worin die ausführbaren Dateien sind. gas hat keine Schalter wie gcc, die ausführbare Datei des GNU C Compilers, für einen eigenen Suchpfad und den Aufruf anderer Ausgaben. Um einen Cross-Assembler in einer Shell bequem aufzurufen, kann z. B. in deren Konfigurationsdatei ein alias[11][12] für /usr/binutils-<soundso>/as eingetragen werden.
GNU Assembler und Microsoft Windows
[Bearbeiten | Quelltext bearbeiten]In Cygwin v3.5.5 läuft gas ab Windows 8.1,[13] binutils in neuester Fassung kann kompiliert für x86-64[14] und als Quellenpaket[15] vom Entwickler heruntergeladen werden.
Für MinGW gibt es eine eigene Ausgabe der binutils.
Verwendung
[Bearbeiten | Quelltext bearbeiten]Der GNU Assembler ist vorrangig dazu vorgesehen von den Compilern der GCC in Assemblersprache verfasste Quellen in Objektdateien zu übersetzen. Je nach Zielsystem haben diese voreingestellt einen bestimmten Namen – für Linux auf x86 ist das a.out, gemäß Übereinkunft erhalten sie allgemein die Endung .o – und sind entweder im, wie in Unix-artigen Betriebssystemen üblich, Executable and Linkable (ELF) oder Common Object File Format (COFF) bzw. einem seiner Abkömmlinge wie dem hauptsächlich in Windows und vom Extensible Firmware Interface verwendeten Portable Executable; und werden ggf. mit dem GNU Linker (ld) aus dem binutils-Paket zu fertigen ausführbaren Binärdateien bearbeitet.
a.out ist gemäß Voreinstellung von gas ausführbar gemacht. Der Name darf nicht mit dem altertümlichen Format verwechselt werden.
Benutzerschnittstellen
[Bearbeiten | Quelltext bearbeiten]Wie gcc usw. können as auch ohne vorgeschalteten Compiler im Befehlszeileninterpreter bzw. am Terminal Textdateien geeigneten Inhalts zur Verarbeitung übergeben werden (dazu s. folgenden Abschnitt). Überdies ist in manchen Entwicklungsumgebungen (Cross)assemblerprogrammierung mit gas möglich: bspw. werden die GNU-Werkzeuge vom C/C++ Development Toolkit für Eclipse[16] auf mind. acht Mikroarchitekturen[17] und von SASM für i386 und amd64[18][19] unterstützt.
Optionen
[Bearbeiten | Quelltext bearbeiten]Der GNU Assembler hat allgemeine und tws. viele für das System, für das assembliert werden kann, verfügbare Aufrufparameter, von denen einige folgend aufgeführt sind. Dabei ist zu beachten, dass in der Unixwelt case sensitivity vorherrscht.
--helpzeigt eine Zusammenfassung über die Optionsschalter,--target-helpeine über die zielbezogenen.
--dump-configzeigt wie der Assembler eingestellt ist.
- Mit
-a, einer angehängten Folge bestimmter Kleinbuchstaben, einem abschließenden=und einem folgenden Dateinamen wird in der Datei ein Protokoll über bestimmte Eigenschaften der zu erfolgenden Assemblierung verfasst.
--statisticsgibt die größte Arbeitsspeicherbelegung während der Assemblierung und deren Dauer an.
-v(--verbose) zeigt die Version von as an,--version(-version) beendet zudem die Ausführung.
Verschiedene Schalter dienen der Behebung von oder dem Umgang mit Fehlern oder bestimmen die Darstellung in der Protokolldatei.
--weist formal darauf hin, dass as die Standardeingabe lesen soll und kann auch weggelassen werden. Ist diese das Terminal können Zeilen von Code eingegeben und die Eingabe mit StrgD (EOF) beendet werden.
Jedes Befehlszeilenargument ohne festgelegte Bedeutung wird von as als zu assemblierende Datei aufgefasst. Die übergebene Folge von Dateien wird von links gelesen und in eine Objektdatei, bestehend aus ausführbarem Maschinencode und zusätzlichen Daten, übersetzt.
Wird gas vom gcc aufgerufen kann dieser mit dem Schalter -Wa jenes Parameter zu ihm durchreichen, indem sie nach einem Komma von Kommata getrennt eingetragen werden, also gemäß
in einer Befehlszeile.
x86
[Bearbeiten | Quelltext bearbeiten]Es gibt Schalter für u. a. Übersetzung von Vektorbefehlen und Speicherausrichtung von Programmverzweigungen.
- Die
-march=zu übergebenden und mit einem Pluszeichen voneinander zu trennenden Werte stehen für einen Befehlssatz, darunter z. B. i8086, k8, core2, generic32 und generic64; und wahlweise Erweiterungen oder bestimmte Befehle wie z. B. die Numeric Processor, Streaming SIMD und Advanced Vector Extensions, die mit vorgesetztem no ausgeschlossen werden können. Die angewiesene Assemblierung darin nicht enthaltener Befehle verursacht eine Fehlermeldung.
-mtune=nimmt dieselben Werte für den Befehlssatz an und veranlasst gas, für den entsprechenden Prozessor optimierten Maschinencode zu erzeugen.
Beispiel:
erfahrener_Programmierer@Tischrechner:~$ as -march=athlon+mmx+no3dnow+sse -mtune=generic64 assembly-Programm.S -o Maschinenprogramm.elf
Der Benutzer lässt in der Unix-Shell eine Quelltextdatei so assemblieren, dass das zu erzeugende Programm auf Lauffähigkeit auf dem AMD Athlon XP hin geprüft, Optimierung für Prozessoren seit amd64 wenn möglich vorgenommen und die Verwendung von 3DNow! ausgeschlossen wird, zudem erhält die Ausgabedatei einen anderen als den voreingestellten Namen.
ARM64
[Bearbeiten | Quelltext bearbeiten]Es gibt fünf Schalter für die Assemblierungseinstellung. Es kann bestimmt werden, ob die Ausgabedatei entweder für einen rangaufsteigend oder rangabsteigend speichernden (s. endianness) Prozessor geeignet; und ob sie im ELF64 oder -32 ist.
- Wie bei den Befehlssätzen von x86 kann mit
-mcpu=eine Art Rechenkern bspw. alscortex-a55oderexynos-m1angegeben werden; mit dem Unterschied, dass etwaige Befehlssatzerweiterungen voreingestellt inbegriffen sind.
- Entsprechend kann mit
-march=eine Mikroarchitektur ab armv8-a bis armv9.4-a (Stand Juni 2024) gewählt werden, wobei Erweiterungen nicht immer voreingestellt dabei sind.
Werden weder Prozessor noch -generation bestimmt, gilt -mcpu=all, was bedeutet, dass alle Befehle assembliert werden.
Syntax
[Bearbeiten | Quelltext bearbeiten]Die Syntax des GNU Assemblers hat einen allgemeingültigen Teil für alle unterstützten Architekturen. Er ist ähnlich vielen anderen Assemblern und von früheren Unix-Assemblern beeinflusst. Er beinhaltet u. a. Anweisungen für den Assembler, sog. Direktiven, Methoden zum Kommentieren und Darstellung von Zahlenwerten („Konstanten“).
Maschinenabhängige Ausdrücke wie insbesondere Befehle und Register sind der Herstellerbeschreibung zu entnehmen.
Direktiven
[Bearbeiten | Quelltext bearbeiten]Assembler-Direktiven (auch pseudo-ops genannt) werden aus einem Schlüsselwort mit einem Punkt beginnend gebildet. Die meisten verfügbaren Direktiven sind architekturunabhängig, einige wenige hardwarespezifisch.[20] Sie werden üblicherweise kleingeschrieben doch das ist für die meisten Systeme nicht bedeutungsunterscheidend. Viele haben eine Folge von Argumenten bestimmter Typen. Wirkt eine Direktive sich auf dieselbe Eigenschaft wie ein Schalter bei der Assemblierung aus, hat sie den Vorrang.
Kommentare
[Bearbeiten | Quelltext bearbeiten]Kommentare können allgemein zwischen /* und */ geschrieben werden. Zeilenkommentare einleitende Zeichenfolgen wie /, //, ; usw. sind zielabhängig.
Für die x86-Mikroarchitektur nutzt GAS standardmäßig eine Raute für Einzelzeilenkommentare. Beispiel:
pop %edx # alles hinter der Raute ist Kommentar
#AX und DX sind 86er Register
movl %edx,%eax
Konstanten
[Bearbeiten | Quelltext bearbeiten]Werte können auf verschiedene Weisen geschrieben werden, die außer für dezimale Ganzzahlen von Vorsätzen bestimmt werden: 0b für Binär-, 0 für Oktal-, 0x für hexadekadische Zahlen und ' für Schriftzeichen; Fließkommazahlen kann zielabhängig z. B. 0f vorgesetzt werden. Zu den Ganzzahlen gehören auch „bignums“, sie sind länger als 32 bits, entsprechen somit z. B. dem 64 bits langen Datentyp long mancher Hochsprachen[21][22] und können nicht uneingeschränkt verwendet werden. Zeichen sind ein byte lang, ihre Darstellung ist vom auf dem System verwendeten Zeichensatz abhängig, also z. B. nach Art der ISO 8859-15, sie können als Escape-Sequenz eingetragen werden und zielabhängig kann ein abschließendes Halbes Schreibmaschinenersatzzeichen nötig sein.
Wird einem Wert der Operator - vorangestellt ist das Ergebnis der binär komplementäre Wert; entsprechend erzeugt ~ den bitweise komplementären.
Inline-Assembler
[Bearbeiten | Quelltext bearbeiten]Der GNU Assembler beherrscht, ähnlich z. B. dem Microsoft Macro Assembler (MASM) und insb. LLVM,[23] eine eingebettete („inline“) Syntax, die es ermöglicht, maschinennahe Programmabschnitte effektiv in einen Hochsprachenteil einzubinden. Dies geschieht durch eine Liste der Eingabe-, Ausgabe- und der im Assemblersprachenteil verwendeten Register.[24] Hierdurch kann der Compiler diesen während der Optimierung ohne Übergabe-Overheads an den Hochsprachenteil anbinden.
Das obige Beispiel als GNU-C-Inline-Assembler in Intel-Syntax:[Anm 1]
asm volatile (".intel_syntax noprefix\n\t"
"pop edx ;Zeilenkommentar mit einleitendem Zeichen gemäß Intelsytax\n\t"
"mov eax, edx\n\t"
".att_syntax\n\t"
: /* no output operands */
: "d" (save_var), "a" (temp_var) /* input operands */
: "eax", "edx" /* intern verwendete register (clobber list) */);
x86-16
[Bearbeiten | Quelltext bearbeiten]Infolge der Wortlänge von 2 Bytes der Intel 8086, 80286 u. ä. kann der GNU Assembler auf ihnen nicht laufen. Um Programme für sie (oder den Real oder Virtual 8086 Mode) zu assemblieren, kann die Direktive .code16 zur Voreinstellung verwendet werden. Das gewährleistet nicht, dass das Programm auf den alten Prozessoren läuft. Dazu muss auf alle 32- und 64-Bit-Ausdrücke verzichtet werden, sonst werden sie mit den Maschinensprachenvorsätzen 66h oder 67h für die entsprechenden Operanden- bzw. Arbeitsspeicheradressenlängen zur Übersteuerung der Real-Mode-Voreinstellung assembliert. Es dürfen daher insbesondere nur die Befehlsanhänge -b für 1 byte oder -w für 2 bytes („word“) lange Operanden in AT&T-Ausdrucksweise wie bei movb und Registernamen wie %ax statt %eax oder %rax (s. Register des 8086) verwendet werden.
Kritik
[Bearbeiten | Quelltext bearbeiten]Eine Quelle negativer Kritik an GAS ist, dass für die Zielsysteme x86-32 und x86-64 (als „80386“ zusammengefasst) anstelle der meistens verwendeten Syntax nach Art des eingestellten ASM86 von Intel die im Umfeld Unix-artiger Betriebssysteme bevorzugte AT&T-Assembler-Syntax[25] voreingestellt ist.[26] Das ist allerdings in der Kompatibilität zur GCC begründet,[27] denn so können beispielsweise Ausdrücke in C übersichtlicher eingefügt werden. Seit binutils 2.10 von Juni 2000[28][29] kann die vorgegebene Syntax über die Direktiven .intel_syntax geändert bzw. .att_syntax wiederhergestellt werden.[30][31] Die ausführbare Datei von gas für x86 hat auch den Schalter -msyntax= mit den Werten intel und att mit denen jeweils die Syntax bestimmt werden kann.[Anm 2]
Das obige Beispiel in Intel-Syntax:[Anm 3]
.intel_syntax noprefix
pop edx
mov eax, edx
.att_syntax
Anmerkungen
[Bearbeiten | Quelltext bearbeiten]- ↑
asmmit nachfolgender runder Klammerung ist eine Spracherweiterung des gcc; um Compilierung bei Auswahl von C90 usf. zu ermöglichen ist es nötig solchen Schlüsselworten je zwei Unterstriche vor- und nachzusetzen. Für andere Compiler kann ggf. Ersetzung von__asm__mit dem jeweiligen Schlüsselwort angewiesen werden. Der Zusatzvolatileschaltet Optimierung aus, d. h. das Programm wird wie geschrieben compiliert. - ↑ Die Befehle …mnemonic statt …syntax haben die gleiche Verwendung, mit dem Unterschied, dass die Direktiven kein Argument haben.
- ↑ Für x86 wird voreingestellt die Kennzeichnung von Registern mit dem Vorsatz
%verlangt und ist entsprechend für die Direktiven das Argumentprefixvoreingestellt – zwecks Eindeutigkeit der Bezeichner denn zeitgenössische 86er-Mikroprozessoren haben bzgl. des Befehlssatzes mind. 95 Register zzgl. Unterregistern. Andere Vorsätze bleiben davon unberührt. Der gegenteilige Schalter ist-mnaked-reg.
Siehe auch
[Bearbeiten | Quelltext bearbeiten]Weblinks
[Bearbeiten | Quelltext bearbeiten]- Offizielle Webseite der binutils (englisch)
- GAS-Handbuch (englisch, in neuester Ausgabe)
- as(1) — Linux manual page (englisch), jew. nach kurzem auf dem neuesten Stand
- Ein Vergleich von GAS und NASM von IBM (englisch, 2007)
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ sourceware.org. (abgerufen am 8. Februar 2021).
- ↑ George Whittaker: GNU Binutils 2.47 Released with New RISC-V Features, Linker Improvements, and Reproducible Builds. In: Linux Journal. Slashdot Media, 30. Juli 2026, abgerufen am 17. Oktober 2026 (englisch).
- ↑ Document Information. In: x86 Assembly Language Reference Manual. Oracle, abgerufen am 10. Oktober 2026 (englisch). Oracle Solaris x86 Assembler, Handbuch von Oktober 2012.
- ↑ Assembler overview. In: https://www.ibm.com/docs/en/aix/7.3.0. IBM, 15. August 2026, abgerufen am 18. Oktober 2026 (englisch).
- ↑ Gaurav Kamathe: 9 essential GNU binutils tools. Binary analysis is the most underestimated skill in the computer industry. In: Opensource.com. Red Hat, 4. Oktober 2019, abgerufen am 17. Oktober 2026 (englisch).
- ↑ as(1) - NetBSD Manual Pages. In: man.netbsd.org. NetBSD-Projekt, abgerufen am 18. Oktober 2026 (englisch). as - the portable GNU assembler. In: man.openbsd.org. OpenBSD-Projekt, abgerufen am 18. Oktober 2026 (englisch). AS - the portable GNU assembler. In: leaf.dragonflybsd.org/cgi/web-man. DragonFly-Projekt, abgerufen am 18. Oktober 2026 (englisch).
- ↑ binutils 2.42. Arch Linux ARM, abgerufen am 27. November 2024 (englisch).
- ↑ Paket: binutils (2.44-3). In: Debian-Paketverzeichnis. Debian-Projekt, abgerufen am 19. September 2026 (englisch, mehrsprachig). Binärpakete für acht Mikroarchitekturen.
- ↑ Bruce Perens, …: Installing Debian GNU/Linux 3.0 For Intel x86 Chapter 2 - System Requirements. In: ftp.up.pt/debian-archive/. Universidade do Porto, 15. Mai 2002, abgerufen am 17. September 2026 (englisch). Eines der letzten bekannten Linuxe für den 386er Befehlssatz. Packages. In: ftp.up.pt/debian-archive/. Universidade do Porto, 1. Januar 2007, abgerufen am 17. September 2026 (englisch). binutils 2.12.90.0.1-4 .
- ↑ binutils-z80 2.31.1. In: Debian package repository. Debian, abgerufen am 29. November 2024 (englisch, mehrsprachig). Komprimierte Archive für amd64, ARM64, i386 und ARMhf.
- ↑ dash(1) — Linux manual page, DESCRIPTION. In: Linux Manual Pages, General Commands Manual. Michael Kerrisk, 8. Juni 2024, abgerufen am 14. Dezember 2024 (englisch). Abschnitt Invocation; Abschnitt Builtins, Eintrag alias.
- ↑ 8.6.1 /etc/profile ( vom 22. Dezember 2004 im Internet Archive)
- ↑ Cygwin-Webseite vom 30. Dezember 2024 (englisch).
- ↑ Package: binutils. In: Cygwin. Red Hat, 24. August 2024, abgerufen am 8. Dezember 2024 (englisch).
- ↑ Source Package: binutils. In: Cygwin. Red Hat, 24. August 2024, abgerufen am 8. Dezember 2024 (englisch).
- ↑ Erich Styger: Creating a GNU Assembly-Only Project. In: MCU on Eclipse. Erich Styger, 21. Mai 2023, abgerufen am 9. Oktober 2026 (englisch).
- ↑ Paket: libeclipse-cdt-java (9.9.0-5). In: Debian-Paketverzeichnis. Debian-Projekt, abgerufen am 9. Oktober 2026 (englisch, mehrsprachig). Quelloffenes Eclipse-CDT von 2019. Paket: openjdk-25-jre (25.0.4.1+1-1~deb13u1). In: Debian-Paketverzeichnis. Debian-Projekt, abgerufen am 18. Oktober 2026 (mehrsprachig).
- ↑ Dmitrij "Dman95" Manušin: SASM. Simple crossplatform IDE for NASM, MASM, GAS, FASM assembly languages. In: GitHub. Abgerufen am 9. Oktober 2026 (russisch, englisch). Neueste Fassung am 8.2.2026 veröffentlicht.
- ↑ Paket: sasm (3.15.0+ds-1). In: Debian-Paketverzeichnis. Debian-Projekt, abgerufen am 9. Oktober 2026 (englisch, mehrsprachig).
- ↑ The GNU Assembler – Assembler Directives. In: sourceware.org. Abgerufen am 27. März 2022 (englisch).
- ↑ C von A bis Z – Das umfassende Handbuch von Jürgen Wolf bei Rheinwerk, 3. Auflage; Abschnitte 5.4f.
- ↑ James Gosling, Bill Joy, …: 4.2. Primitive Types and Values. In: The Java® Language Specification, Java SE 23 Edition. Oracle Corporation, 21. August 2024, abgerufen am 30. Dezember 2024 (englisch).
- ↑ Language Compatibility, Inline assembly. In: clang.llvm.org. LLVM-Projekt, abgerufen am 24. Oktober 2026 (englisch).
- ↑ 5. Extended Asm. In: ibiblio.org. 1. März 2003, abgerufen am 27. Juli 2011 (englisch): „[…] we can also specify the operands. It allows us to specify the input registers, output registers and a list of clobbered registers“
- ↑ Assemblers. In: weblog von MaskRay. Abgerufen am 16. Oktober 2026 (englisch, Überarbeitung von Mai 2025).
- ↑ Susan Welsh: AT&T Assembly Syntax ( vom 7. Januar 2020 im Internet Archive). Sig 9, 17. Juli 2017. (englisch).
- ↑ AT&T Syntax versus Intel Syntax. In: ftp.gnu.org. Abgerufen am 17. Dezember 2024 (englisch).
- ↑ GAS. Sourceforge, abgerufen am 21. November 2024 (englisch).
- ↑ Index der binutils-Archive. GNU-Projekt, abgerufen am 21. November 2024 (englisch).
- ↑ Ram Narayan: Linux assemblers: A comparison of GAS and NASM. A side-by-side look at GNU Assembler (GAS) and Netwide Assembler (NASM). In: developer.ibm.com. 16. Oktober 2007, abgerufen am 27. Dezember 2024 (englisch).
- ↑ Ayman Alheraki: #9 Mastering GAS: A Complete Guide to the GNU Assembler. Series for explaining and teaching GNU GAS Assembler using AT&T syntax. In: SimplifyC++. Ayman Alheraki, abgerufen am 16. Oktober 2026 (englisch). Abschnitt Switching Between AT&T and Intel Syntax.