GNU Assembler
GNU Assembler
| |
---|---|
Basisdaten
| |
Entwickler | GNU-Projekt |
Erscheinungsjahr | 1986 |
Aktuelle Version | toolset version of binutils[1] |
Betriebssystem | Cross-platform |
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. Er wird zum Assemblieren des GNU-Betriebssystems, des Linux-Kernels und vieler anderer Applikationen verwendet. Er gehört zum GNU-Binutils-Paket.
Die ausführbare Datei des GNU Assemblers ist nach dem Unix Assembler (as) benannt. GAS ist plattformübergreifend, und damit für eine große Anzahl von verschiedenen Rechnerarchitekturen sowohl lauf- als auch assemblierfähig. GAS wird unter der GNU General Public License v3 veröffentlicht und ist freie Software.
Allgemeingültige Syntax
[Bearbeiten | Quelltext bearbeiten]Der GNU Assembler hat eine allgemeingültige Syntax für alle unterstützten Architekturen. Diese Syntax beinhaltet Assembler-Direktiven und Methoden zum Kommentieren.
Assembler-Direktiven
[Bearbeiten | Quelltext bearbeiten]Der GNU Assembler verwendet Assembler-Direktiven (auch als pseudo-ops bekannt), welche aus einem Schlüsselwort beginnend mit einem Punkt gebildet werden. Die meisten verfügbaren Direktiven sind architekturunabhängig, einige wenige hardwarespezifisch.[2]
Kommentare
[Bearbeiten | Quelltext bearbeiten]GAS nutzt standardmäßig das Rautezeichen (#
) für einen Einzelzeilenkommentar. Beispiel:
pop %edx # dies ist ein Kommentar
# dies ebenfalls
movl %edx,%eax
Kritik
[Bearbeiten | Quelltext bearbeiten]Eine Quelle von Kritik an GAS ist, dass er für die x86- und x64-Architekturen anstelle der verbreiteteren Intel-Syntax die AT&T-Assembler-Syntax verwendet.[3] Das ist allerdings in der Kompatibilität zu GCC begründet,[4] und kann in neueren Versionen über die Direktive .intel_syntax
geändert werden.[5]
Das obige Beispiel in Intel Syntax:
.intel_syntax noprefix
pop edx #Intel-syntax kommentar
mov eax, edx
.att_syntax prefix
Inline Assembler
[Bearbeiten | Quelltext bearbeiten]Der GNU Assembler zeichnet sich gegenüber anderen Assemblern auch durch eine Inline-Syntax aus, die es ermöglicht, den Assembler-Teil effektiv in einen Hochsprachenteil einzubinden. Dies geschieht durch eine Liste der Eingabe-, Ausgaberegister und der im Assembler-Teil verwendeten Register.[6] Hierdurch kann der Compiler einen Assembler-Teil während der Optimierung ohne Übergabe-Overheads an den Hochsprachenteil anbinden.
Das obige Beispiel als C-Inline-Assembler in Intel-Syntax:
__asm__ __volatile__ (".intel_syntax noprefix \n\t"
"pop edx ;Intel-syntax kommentar \n\t"
"mov eax, edx \n\t"
".att_syntax prefix \n\t"
: /* no output operands */
: "d" (save_var), "a" (temp_var) /* inputs operands*/
: "eax", "edx" /* intern verwendete register (clobber list)*/);
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Offizielle Webseite der binutils
- GAS-Handbuch (englisch)
- Ein Vergleich von GAS und NASM von IBM (englisch, 2007)
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ sourceware.org. (abgerufen am 8. Februar 2021).
- ↑ The GNU Assembler – Assembler Directives. In: sourceware.org. Abgerufen am 27. März 2022.
- ↑ Susan Welsh: AT&T Assembly Syntax ( vom 7. Januar 2020 im Internet Archive). Sig 9, 17. Juli 2017.
- ↑ AT&T Syntax versus Intel Syntax abgerufen am 13. November 2019.
- ↑ Ram Narayan: Linux assemblers: A comparison of GAS and NASM bei IBMDeveloper vom 17. Oktober 2007, abgerufen am 13. November 2019.
- ↑ 5. Extended Asm. www.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“