GNU Assembler

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
GNU Assembler

Basisdaten

Entwickler GNU-Projekt
Erscheinungsjahr 1986
Aktuelle Version toolset version of binutils[1]
Betriebssystem Cross-platform
Programmier­sprache 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]

GAS nutzt standardmäßig das Rautezeichen (#) für einen Einzelzeilenkommentar. Beispiel:

pop %edx # dies ist ein Kommentar
# dies ebenfalls
movl %edx,%eax

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)*/);


Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. sourceware.org. (abgerufen am 8. Februar 2021).
  2. The GNU Assembler – Assembler Directives. In: sourceware.org. Abgerufen am 27. März 2022.
  3. Susan Welsh: AT&T Assembly Syntax (Memento vom 7. Januar 2020 im Internet Archive). Sig 9, 17. Juli 2017.
  4. AT&T Syntax versus Intel Syntax abgerufen am 13. November 2019.
  5. Ram Narayan: Linux assemblers: A comparison of GAS and NASM bei IBMDeveloper vom 17. Oktober 2007, abgerufen am 13. November 2019.
  6. 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