Assembler — Änderungen 2829 → 4465

Zeile 1: Zeile 1:
−
Als '''Assembler''' wird einerseits eine einfache Programmiersprache andererseits auch der Übersetzer dieser Programmiersprache in Maschinencode bezeichnet. Die Programmiersprache ist auf einen bestimmten Prozessortyp zugeschnitten und stellt die einzelnen Prozessorbefehle als Wörter (Mnemoniks bzw. engl. Mnemonics) mit eventuellen Parametern da. Damit ist die Sprache kaum portabel.
+
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.
−
Zusätzlich vereinfacht der Übersetzer der Programmiersprache die Adressberrechnung (unter anderem durch Labels) und ermöglicht das Berechnen von Konstanten, die sich aus Formeln zusammensetzen.
 
  
−
== Syntax ==
+
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.
  
−
Es gibt für die x86 Prozessorfamilie verschiedene Syntaxen.<br>
+
== 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
  
−
=== Intel ===
+
== 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
  
−
Die Intel Syntax wird meistens verwendet wenn man Assembler von Hand schreibt.<br>
+
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.
  
−
Beispielcode:
+
=== Syntax ===
−
<asm>
+
Man unterscheidet bei Assembler grob zwischen Intel- und AT&T-Syntax. Zu den Assemblern, deren Syntax auf Intel-Syntax aufbaut, gehören FASM, NASM, MASM, TASM  und YASM. Die AT&T-Syntax kann von dem GNU Assembler, der in den binutils enthalten ist, und YASM verarbeitet werden.
−
mov al, 0x10
 
−
</asm>
 
  
−
=== AT&T ===
+
==== Intel-Syntax ====
 +
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:
 +
<asm>add ebx, eax</asm>
  
−
Diese Syntax wurde speziell für das schnelle Assemblieren entwickelt, um ihn beim Kompilieren von Hochsprachenquellcode als Zwischenschritt zu verwenden.
+
==== AT&T-Syntax ====
 +
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:
 +
<asm>add %eax, %ebx</asm>
  
−
Beispielcode:
+
== Inline-Assembler ==
−
<asm>
+
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]].
−
movb $0x10, %al
 
−
</asm>
 
  
−
Diese Syntax wird vor allem im Zusammenhang mit gcc verwendet. Unter [[Inline-Assembler mit GCC]] befindet sich ein kleines Tutorial hierzu.
+
== 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)]
 +
<!-- TASM? -->
  
−
== Liste bekannter Assembler ==
+
=== Befehlsübersichten ===
−
 
+
* [http://www.intel.com/products/processor/manuals/ Intel Manual Volume 2A/B: Instruction Set Reference]
−
=== Assembler für x86 ===
+
* [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)
−
FASM (flat assembler) [http://flatassembler.net/]<br>
 
−
MASM (Microsoft Macro Assembler) [http://msdn2.microsoft.com/de-de/library/afzk3475(VS.80).aspx]<br>
 
−
NASM (The Netwide Assembler) [http://nasm.sourceforge.net/]<br>
 
−
TASM (Turbo Assembler) [http://info.borland.com/borlandcpp/cppcomp/tasmfact.html]<br>
 
−
YASM (Diese Buchstabenkombination besitzt keine offizielle Langform) [http://www.tortall.net/projects/yasm/]<br>
 
  
 
[[Kategorie:Programmiersprache]]
 
[[Kategorie:Programmiersprache]]
−
[[Kategorie:Lizenz ungeklärt]]