Als Assembler wird sowohl die Assemblersprache, als auch das Programm zur Übersetzung von Quelltexten in Assemblersprache in Maschinensprache bezeichnet. Die CPU führt ausschließlich Maschinenbefehle aus, die als Folge von Bytes im Speicher vorliegen. Jedem Maschinenbefehl ist genau ein Assemblerbefehl (Mnemonic) zugeordnet. Diese 1:1-Abbildung auf die CPU-Befehle hat zur Folge, dass in der Regel Assemblerprogramme nicht zwischen verschiedenen Prozessortypen übertragbar sind. Außerdem werden in Assembler geschriebene Programme schnell sehr lang und erfordern, dass der Programmierer sich wenig zielführend mit vielen Details der Architektur auseinandersetzen muss.
Der sinnvolle Einsatz von Assembler beschränkt sich darauf, eine Umgebung für eine Hochsprache aufzubauen, sowie kurze, plattformabhängige Hilfsfunktionen und Einsprungsstellen für z. B. [[ISR|Interrupt-Behandlungsroutinen]] bereitzustellen.
== Aufgaben eines Assemblers ==
* Übersetzung von Assembler in Maschinencode
* Auflösen der symbolischen Namen (z. B. von Labels) in numerische Konstanten, soweit möglich
* Erzeugung von Objektcode, der in der Regel noch [[Linker|gelinkt]] werden muss
== Aufbau von Assemblerbefehlen ==
Die direkte Abbildung von Assemblerbefehlen auf Maschinenbefehle hat zur Folge, dass Assemblerbefehle immer den selben Aufbau haben. Ein Maschinenbefehl besteht aus einem Opcode, meist gefolgt von einem oder mehreren Operanden. Dieses spiegelt sich auch in Assemblerbefehlen wieder, die immer den gleichen Aufbau haben:
mnemonic operand1, operand2
Bei der x86-Architektur ist bei zweistelligen Operationen (Addition, Subtraktion, bitweise Operationen, etc.), immer einer der beiden Operanden sowohl Quelle als auch Ziel. Es existiert also z. B. ein Befehl, um das Register eax zu ebx zu addieren, und das Ergebnis in ebx zu speichern. Aber es existiert kein Befehl, um das Ergebnis in einem dritten Register zu speichern.
=== Syntax ===
Bei Assembler unterscheidet man verschiedene Syntax. Bei der x86 unterscheidend man zwischen Intel- und AT&T-Syntax. Zu den Assemblern, deren Syntax auf der Intel-Syntax aufbaut, gehören [[FASM]], [[NASM]], MASM und TASM. Die AT&T-Syntax kann von dem GNU Assembler, der in den binutils enthalten ist, und anderen Unix-Assemblern ("as") verarbeitet werden. YASM und neuere Versionen des GNU Assemblers können zwischen beiden Syntax umschalten.
==== Intel-Syntax ====
Als Intel-Syntax bezeichnet man diejenigen Syntax Formen, die von der Syntax des alten Assemblers ASM86 von der Firma Intel abgeleitet worden sind. Zu den Hauptmerkmalen der Intel-Syntax gehört die Reihenfolge der Operanden, bei Befehlen mit zwei Operanden oder mehr. Das Ziel einer derartigen Operation steht immer als erstes in der Operandenliste. Die Addition von eax zu ebx sieht dann z. B. so aus, wobei das Ergebnis in ebx ist:
add ebx, eax
Kommentare werden in der Intel-Syntax mit einem Semikolon eingeleitet:
; Das ist ein Kommentar.
Darüber hinaus wird die Wortlänge anhand der Registerbezeichnung bestimmt. Speicherzugriffe werden mit eckigen Klammern angedeutet.
mov ax, [ebp] ; Lädt ein word (2 Byte Zahl) von der Adresse in ebp nach eax
mov cl, [esi] ; Lädt ein Byte von der Adresse in esi nach cl
Wenn die Wortlänge nicht eindeutig feststellbar ist, muss sie angegeben werden:
push dword ptr [ebp + 4] ; Schiebt ein dword (4 Byte Zahl) von der Adresse, welche um 4 größer ist als die in ebp, auf den Stack.
Alle Bestandteile der Adresse werden in der Klammer angegeben, werden die Klammern Weggelassen wir eine Konstante oder der Registerinhalt verwendet:
add dh, [ebp + eax*4 + 5] ; Addiert dh mit den Byte, dessen Adresse sich durch ebp + eax*4 + 5 berechnen lässt
sub ecx, 16 ; Verringert den Wert in ecx um 16
or ecx, eax ; ecx = Wert in ecx OR Wert in eax
Allerdings wird die Zuordnung Adresse = eckige Klammer in einigen Assembler nicht konsequent verwendet, so das man Aufpassen muss.
==== AT&T-Syntax ====
Der AT&T-Syntax leitet sich von derjenigen Syntax ab, die der Unix Assembler (as) für verschiedene Prozessorplattformen verwendet. Auf der x86-Plattform ist sie zwar weniger verbreitet, allerdings arbeitet die GNU Implementierung der Unix-Werkzeuge (gcc, gdb, ...) vorwiegend mit damit. In der AT&T-Syntax werden die Register mit einem % als Präfix versehen, und der Zieloperand ist der letzte Operand. Das Beispiel von eben sieht dann so aus:
add %eax, %ebx
Kommentare werden im AT&T-Syntax mit einem Doppelkreuz eingeleitet:
# Das ist ein Kommentar.
Die Wortlänge wird als Suffix an den Opcode angehängt, "b" steht für Byte, "w" für Word (2 Byte), "l" für DWord (4 Byte) und "q" für QWord (8 Byte). Die Wortlänge kann aber weggelassen werden, wenn die Länge aus den Registernamen hervorgeht.
Register als Addresszeiger verwendet, werden sie eingeklammert.
movw (%ebp), ax # Lädt ein Word (2 Byte Zahl) von der Adresse in ebp nach eax
movb (%esi), cl # Lädt ein Byte von der Adresse in esi nach cl
pushl 4(%ebp) # Schiebt ein dword (4 Byte Zahl) von der Adresse, welche um 4 größer ist als die in ebp, auf den Stack. S.u.
Die Bezeichnung von Addressen ist allerdings komplizierter. Sie werden wie folgt dargestellt (wobei alle Bestandteile Optional sind.):
(,,)
Also z.B.
addb 5(ebp,eax,4), dh # Addiert dh mit den Byte, dessen Adresse sich durch ebp + eax*4 + 5 berechnen lässt
addb 12345, dh # Addiert dh mit den Byte von der Adresse 12345
Konstanten wird ein Dollarzeichen vorgestellt, um sie von Addressen zu unterscheiden.
subl $16, ecx # Verringert den Wert in ecx um 16
== Inline-Assembler ==
Als Inline-Assembler bezeichnet man die Einbettung von Assemblerbefehlen im Quelltext eines Hochsprachenprogramms. Dieses erweist sich als nützlich, wenn man nicht den Umweg über einen Funktionsaufruf gehen will, um Assemblercode auszuführen. Siehe auch [[Inline-Assembler mit GCC]].
== Weblinks ==
=== Assembler ===
* [http://www.nasm.us/ NASM (Netwide Assembler)]
* [http://msdn.microsoft.com/en-us/library/afzk3475.aspx MASM (Microsoft Macro Assembler)]
* [http://www.flatassembler.net/ FASM (Flat Assembler)]
* [http://www.tortall.net/projects/yasm/ YASM]
* [http://sourceware.org/binutils/docs-2.19/as/GNU-Assembler.html GAS (GNU Assembler)]
=== Befehlsübersichten ===
* [http://www.intel.com/products/processor/manuals/ Intel Manual Volume 2A/B: Instruction Set Reference]
* [http://www.amd.com/us-en/Processors/DevelopWithAMD/0,,30_2252_875_7044,00.html AMD Manual Volume 3: General-Purpose and System Instructions]
* [http://www.pbhq.de/asm86faq/ ASM86FAQ] (10 Jahre alt, aber auf Deutsch)
* [http://www.i8086.de i8086.de]
[[Kategorie:Programmiersprache]]
[[en:Assembly]]