GNU Assembler

aus Wikipedia, der freien Enzyklopädie
GNU Assembler
Basisdaten

Entwickler GNU-Projekt
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

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

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.[1]

Kommentare

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

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

Kritik

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.[2] Das ist allerdings in der Kompatibilität zu GCC begründet,[3] und kann in neueren Versionen über die Direktive .intel_syntax geändert werden.[4]

Das obige Beispiel in Intel Syntax:

.intel_syntax noprefix
pop edx        #Intel-syntax kommentar
mov eax, edx
.att_syntax prefix

Inline Assembler

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.[5] 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

Einzelnachweise

  1. The GNU Assembler – Assembler Directives. In: sourceware.org. Abgerufen am 27. März 2022.
  2. Susan Welsh: AT&T Assembly Syntax (Memento vom 7. Januar 2020 im Internet Archive). Sig 9, 17. Juli 2017.
  3. AT&T Syntax versus Intel Syntax abgerufen am 13. November 2019.
  4. Ram Narayan: Linux assemblers: A comparison of GAS and NASM bei IBMDeveloper vom 17. Oktober 2007, abgerufen am 13. November 2019.
  5. 5. Extended Asm. (englisch) www.ibiblio.org. 1. März 2003. Abgerufen am 27. Juli 2011: „[...]we can also specify the operands. It allows us to specify the input registers, output registers and a list of clobbered registers