Zum Inhalt springen

„Assembler (Informatik)“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[ungesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Unicode-Zeichen entfernt/ersetzt; form
 
(242 dazwischenliegende Versionen von mehr als 100 Benutzern, die nicht angezeigt werden)
Zeile 1: Zeile 1:
{{Dieser Artikel|behandelt das Systemprogramm zur Übersetzung von Assemblercode in Maschinencode. Als ‚Assembler‘ wird auch die dabei zugrundeliegende Programmiersprache bezeichnet; siehe [[Assemblersprache]].}}
Ein '''Assembler''' der Informatik ist ein spezielles Übersetzungsprogramm, das ein in einer maschinennahen [[Assemblersprache]] geschriebenes [[Computerprogramm|Programm]] in [[Maschinensprache]] übersetzt. Oft wird der Ausdruck ''Assembler'' auch als Abkürzung oder Synonym für ''Assemblersprache'' verwendet.


Ein '''Assembler''' (auch '''Assemblierer'''<ref>[[Deutsches Institut für Normung|DIN]]&nbsp;44300.</ref>) ist ein [[Computerprogramm]], das [[Quelltext]] in [[Maschinensprache]] übersetzt. Der Quelltext eines Assemblerprogramms ist in Textform mit Hilfe mnemonischer Symbole in [[Assemblersprache]] geschrieben. Assembler zählen zu den [[Programmierwerkzeug|von Programmierern verwendeten Werkzeugen]].
Zu beachten ist, dass verschiedene [[Prozessor]]architekturen grundverschiedene Assembler- und Maschinensprachen haben, so dass jeweils ein zur aktuellen Architektur passender ''Assembler'' benötigt wird. Es gibt jedoch Assemblerfamilien, die mehrere Prozessoren unterstützen bei gleichbleibender [[Makro]]sprache und Arbeitsumgebung; der [[GNU Assembler]] ist z. B. eine solche Familie.


Der erste Quelltext, in dem Assemblersprache zur Darstellung von Maschinencode verwendet wird, findet sich in [[Kathleen Booth|Kathleen]] und [[Andrew Donald Booth]]s 1947 erschienenem Werk “Coding for A.R.C.”.<ref>{{cite book |last1=Booth |first1=Andrew D |last2=Britten |first2=Kathleen HV |title=Coding for A.R.C. |date=1947 |publisher=Institute for Advanced Study, Princeton |url=https://albert.ias.edu/bitstream/handle/20.500.12111/7941/Booth_Britten_Coding_for_ARC_1947.pdf?sequence=1&isAllowed=y |language=en |access-date=2022-11-04}}</ref> Der erste Assembler wurde zwischen 1948 und 1950 von [[Nathaniel Rochester]] auf dem [[Computersystem]] [[IBM 701]] [[Implementierung#Softwaretechnik|implementiert]].
Die einfachste Version eines Assemblers, kombiniert mit der Möglichkeit, Programme interaktiv zu testen und zu analysieren, wird [[Maschinensprachemonitor]] genannt. Makroassembler gestatten die Bildung von parametrisierbaren Befehlsgruppen. Eine Makroanweisung wird im allgemeinen in mehr als einen Maschinenbefehl umgesetzt.


== Beschreibung ==
Der Anteil der Assemblerprogrammierung ist im Sinken. Der Möglichkeit der Erstellung effektiver Programme steht die erschwerte Wartbarkeit von Assemblerprogrammen gegenüber. Maschinennahe Programmierung – die Domäne von Assembler – kann heute überwiegend durch höhere Programmiersprachen abgedeckt werden. Einige Programmiersysteme für höhere Programmiersprachen gestatten es, Assemblerbefehle in den Quelltext mittels [[Inline-Assembler]] zu integrieren. Die Anwendung kann sich dann auf die Situationen beschränken, in denen es aus funktionalen oder [[Effizienz]]gründen notwendig oder nützlich ist, maschinennah zu programmieren.
Immer mehr an maschinennaher Programmierung – die Domäne von Assemblersprache – kann heute fast vollständig durch [[höhere Programmiersprache]]n abgedeckt werden. Auch steht der Möglichkeit der Erstellung effizienter Programme die erschwerte Wartbarkeit von Assemblerprogrammen gegenüber. Für optimalen Code wird immer mehr Kontextwissen benötigt (zum Beispiel: Cachenutzung, Lokalität, temporale Nutzung etc.). Ein Beispiel hierfür wäre der [[Streaming SIMD Extensions|SSE]]-Befehl ''movntq'', welcher wegen fehlenden Kontextwissens nicht oder nur sehr spekulativ von [[Compiler]]n eingesetzt werden kann. Auf der anderen Seite benutzen die meisten Compiler für höhere Programmiersprachen nur einen kleinen Teil des Befehlssatzes der CPU (ein Sachverhalt, der zur Entwicklung von [[Reduced Instruction Set Computer|RISC]]-Prozessoren geführt hat), während dem Assemblerprogrammierer der vollständige Befehlssatz zur Verfügung steht, sodass er in manchen Situationen effizientere Befehle benutzen kann, die dem reinen Hochsprachenprogrammierer nicht zugänglich sind.
Einige Programmiersysteme für höhere Programmiersprachen gestatten es, Assemblersprachenbefehle mittels [[Inline-Assembler]] in den Quelltext zu integrieren. Die Anwendung kann sich dann auf die Situationen beschränken, in denen es aus funktionalen oder [[Effizienz (Informatik)|Effizienzgründen]] notwendig oder nützlich ist, maschinennah zu programmieren. Zu beachten ist, dass verschiedene [[Prozessorarchitektur]]en grundverschiedene Assembler- und Maschinensprachen haben, so dass jeweils ein zur aktuellen Architektur passender ''Assembler'' benötigt wird und die Programme nicht oder nur unter großen Einschränkungen [[Plattformunabhängigkeit|portabel]] sind. Makroassembler gestatten die Bildung von [[Parameter (Informatik)|parametrisierbaren]] Anweisungen. Eine Makroanweisung wird im Allgemeinen in mehr als einen Maschinenbefehl umgesetzt.


== Abgrenzung zu Hochsprachencompilern ==
''Siehe auch:'' [[Cross-Assembler]]
Assembler sind immer spezifisch auf einen oder wenige Prozessortypen ausgerichtet. Für die [[IA-32|IA32-Architektur]] unterscheiden sich Assembler und Assemblersprache beispielsweise vollständig von dem für die [[MIPS-Architektur]]. Manche Hochsprachencompiler übersetzen ein Programm zuerst in Assemblersprache und rufen dann einen Assembler zur Erzeugung von Maschinensprache auf. Während sich Hochsprachen eher an der menschlichen Sprache orientieren und somit verhältnismäßig leicht verständlich sind, orientiert sich Assemblersprache eng an der Maschine. In Assemblersprache entsprechen die [[Opcode]]s und die Referenz von Datenfeldern (wie <code>add BETRAG,SUMME</code>) als sogenannte [[Assemblersprache#Beschreibung|Mnemonics]] dem [[Befehlssatzarchitektur|Befehlssatz]] der jeweiligen [[Prozessor|CPU]]; dessen Verständnis ist somit bei Assembler Voraussetzung. Dagegen muss man sich in einer Hochsprache kaum oder überhaupt nicht um die darunterliegende CPU kümmern. Auch werden an einen Compiler ganz andere Ansprüche zum Erfassen des Laufzeitverhaltens eines Programms gestellt, besonders beim Treffen auf [[Rekursion|rekursive]] Funktionen, oder große Mengen zusätzlichen Quellcodes generiert (etwa [[Generische Programmierung|Templates]]), teilweise auch bereits beim Kompilieren Code ausgeführt (Compile-Time-Function-Evaluation).


Obwohl vereinfacht und nicht immer zutreffend wird die Unterscheidung häufig darin gesehen, dass ein Compiler einzelne Anweisungen im Quelltext in jeweils mehrere Maschinenbefehle überführt, während bei einem Assembler hierbei typischerweise eine Eins-zu-Eins-Abbildung vorliegt.<ref>Peter Calingaert: ''Assemblers, compilers, and program translation.'' Computer Science Press, Potomac, MD, 1979. ISBN 0-914894-23-4. S. 186–187</ref>
==Abgrenzung zu [[Compiler]]n==
Im Unterschied zu Compilern, die eine Hochsprache wie z.B. [[C (Programmiersprache)|C]] oder [[Pascal (Programmiersprache)|Pascal]] in Maschinensprache übersetzen, sind Assembler immer spezifisch auf einen oder wenige Prozessortypen ausgerichtet.


== Aufgaben eines Assembler ==
Beim Assembler werden die Opcodes der jeweiligen CPU mit Namen, den sogenannten [[Mnemonics]] angegeben, während Hochsprachen primär die Umsetzung in Opcodes über mehrere automatisierte Abstraktionsebenen hinweg bewerkstelligen. Dadurch werden Eigenschaften wie etwa eine begrenzte Registerbreite vor dem Programmierer versteckt. In Assembler sind nur Operationen im Rahmen der möglichen Register- und Operationsgrößen der CPU möglich. Oftmals sind Pragma-, Preprozessor- und Makrofähigkeiten in Assemblern möglich, die sich aber nur bedingt mit den Möglichkeiten von Hochsprachen vergleichen lassen.
* Umsetzen von Befehlsmnemonics in der Anweisung einer Assemblersprache – beispielsweise den Befehlscode „CLI“ in den Befehlscode „11111010“ ([[Hexadezimalsystem|hexadezimal]] 'FA') einer Maschinensprache
* Umsetzen von Datenmnemonics in deren binäre Repräsentation – beispielsweise „BETRAG“ in Adresse=4711 und Länge=8
* Verwaltung von Konstanten
* Verwaltung von Adressen von Befehlen oder Daten
* Berechnen von zur Übersetzungszeit feststehenden Konstanten mov eax, 4*5 + 6*7 + OFFSET ProgrammStart
* Ignorieren von Kommentaren bei der Codegenerierung
* Inkludieren anderer Programmcode-Dateien
* Interpretieren und Transformieren von Makrocode
* Bedingtes Übersetzen
* Bündeln von zusammengehörenden Daten (z.&nbsp;B. schreibgeschützte Daten)
* Zurückweisen von für diesen Prozessor oder Modus nicht erlaubten Befehlen
* Einbinden von Debugging-Informationen oder anderen Metadaten
* Erzeugen von Übersetzungs-Listings
* Erzeugen von Maschinencode, ggf. als Objektdateien für zweistufige Übersetzungsprozesse mit [[Linker (Computerprogramm)|Linker]] und der Möglichkeit zur Einbindung weiterer Programmteile (z.&nbsp;B. [[Unterprogramm]]en) aus [[Programmbibliothek|Bibliotheken]]


== Spezialformen ==
Assembler sind häufig extrem einfach aufgebaut und daher meist auch sehr schnell.
=== Cross-Assembler ===
Compiler hingegen übersetzen oft zunächst das Programm in eine Zwischensprache, die dann an einen Assembler weitergeleitet und in das letztlich benötigte Maschinenprogramm umgewandelt wird. Bei modernen Compilern erfolgt dieser Schritt implizit.
Ein ''Cross-Assembler'' ist eine Spezialform des Assemblers, der auf einer [[Plattform (Computer)|Computerplattform]] H (Host) läuft und Maschinencode für eine andere Computerplattform T (Target) erzeugt. Er ist damit ein spezieller [[Cross-Compiler]]. Cross-Assembler kommen heute vor allem bei der Entwicklung [[Eingebettetes System|eingebetteter Systeme]] zum Einsatz, um schnellen und kompakten Code für [[Mikrocontroller]] und [[Digitaler Signalprozessor|DSPs]] zu erstellen. Ein Beispiel ist der Cross-Assembler ''ASEM-51'', der auf den Hostplattformen [[MS-DOS]], [[Windows]] und [[Linux]] läuft. Er erzeugt Code für die Mikrocontrollerfamilie ''MCS-51'' von [[Intel]] (Zielplattform).


== [[Disassembler]] ==
=== Disassembler ===
{{Hauptartikel|Disassembler}}
Ein Programm zum Rückübersetzen von Maschinensprache in Assemblersprache ist ein Disassembler. Diese Rückübersetzung ist möglich, da es – anders als bei [[Hochsprache]]n – eine Eins-zu-Eins-Beziehung zwischen einfacher Assemblersprache und Maschinensprache gibt. Dabei können jedoch [[Bezeichner]] und [[Kommentar (Programmierung)|Kommentare]] nicht wiederhergestellt werden, da diese während der Assemblierung verloren gehen.
Ein Programm zum Rückübersetzen von Maschinensprache in Assemblersprache wird als ''Disassembler'' bezeichnet. Diese Rückübersetzung ist möglich, da es – anders als bei [[Höhere Programmiersprache|Hochsprachen]] – eine Eins-zu-Eins-Beziehung zwischen einfacher Assemblersprache und Maschinensprache gibt. Dabei können jedoch [[Bezeichner]] und [[Kommentar (Programmierung)|Kommentare]] nicht wiederhergestellt werden, da diese durch die Assemblierung verloren gehen. Meist werden Assemblersprachen um [[Makro]]funktionalitäten ergänzt, so dass diese direkte Abbildung nur noch teilweise möglich ist.
Meist werden aber etwas komplexere Assemblersprachen mit Makrofähigkeiten verwendet, so dass diese einfache Abbildung nicht mehr hundertprozentig zutrifft.


=== Maschinensprachemonitor ===
Die Tätigkeit des Disassemblierens ist bei [[Urheberrecht|urheberrechtlich]] geschützten Programmen durch [[Copyright]]-Bestimmungen reglementiert bis verboten, da das Disassemblieren die Möglichkeit eröffnet, den Code einfach zu ändern und danach wieder in ein Programm zu assemblieren. So könnte von erfahreneren Assembler-Programmieren und [[Hacker]]n z.B. eine Passwortabfrage entfernt, eine etwa aus lizenzrechtlichen Gründen abgeschaltete Funktion aktiviert, oder ein Virus in das Programm eingeschleust werden.
Auf einigen [[Plattform (Computer)|Plattformen]] existiert eine sehr einfache Version eines Assemblers, kombiniert mit der Möglichkeit, Programme interaktiv zu testen und zu analysieren, die [[Maschinensprachemonitor]] genannt wird.


== Hersteller und Produkte ==
== Hersteller und Produkte ==
Für die [[x86]]-Prozessoren-Familie und kompatible Prozessoren (z. B. Intels [[Pentium]] oder [[AMD]]s [[Athlon]]) sind der [[Microsoft]] Macro Assembler ([[MASM]]), [[Borland]] Turbo Assembler ([[TASM]]) und der Netwide Assembler ([[NASM]]) weit verbreitet. Auch der Flat Assembler ([[Flat Assembler|FASM]]) bietet viele Features, die ein moderner Assembler benötigt. Neben Assemblern, die die Intel-Syntax kennen, gibt es noch solche, die Assemblercode in der [[AT&T]]-Syntax assemblieren können, wie den unter [[Linux]] hauptsächlich genutzten GNU Assembler ([[gas]]).
Für die [[X86-Prozessor|x86]]-Prozessoren-Familie und kompatible Prozessoren (zum Beispiel [[Intel]]s [[Pentium]] oder [[AMD]]s [[Athlon]]) sind der [[Microsoft]] Macro Assembler ([[Microsoft Macro Assembler|MASM]]), der [[Borland]] [[Turbo Assembler]] (TASM) und der [[Netwide Assembler]] (NASM) weit verbreitet. Auch der Flat Assembler ([[Flat assembler|FASM]]) bietet viele Features, die ein moderner Assembler benötigt. [[Yasm]] schließlich ist ein Rewrite von NASM unter [[BSD-Lizenz]]. Neben Assemblern, die die [[Intel Syntax|Intel-Syntax]] kennen, gibt es noch solche, die Assemblercode in der [[AT&T]]-Syntax assemblieren können, wie den unter [[Linux]] hauptsächlich genutzten [[GNU Assembler]] (GAS).
GAS unterstützt ab Version 2.10 über die ''.intel_syntax'' Direktive auch die [[ASM86|Intel-Syntax]].<ref name="GASvsNASM">{{cite web|url=http://www.ibm.com/developerworks/library/l-gas-nasm/|title=Linux assemblers: A comparison of GAS and NASM|date=2007-10-17|accessdate=2008-07-02|author=Ram Narayam|language=en }}</ref><ref name="WhichAsm">{{cite web|url=http://edu.mmcs.sfedu.ru/~ulysses/Edu/MP/WhichAsm.html|title=Which Assembler is the Best?|accessdate=2008-05-18|author=Randall Hyde|language=en |offline=0}}</ref><ref>{{cite web|title=GNU Assembler News, v2.1 supports Intel syntax|url=http://sourceware.org/cgi-bin/cvsweb.cgi/src/gas/NEWS?rev=1.93&content-type=text/x-cvsweb-markup&cvsroot=src|date=2008-04-04|accessdate=2008-07-02|language=en |offline=0}}</ref> Auf [[IBM]]-[[Großrechner]]n ([[System z]]) wird der ''High Level Assembler'' verwendet, [[Hercules (Emulator)|Hercules]]-Anwender müssen entweder den veralteten Assembler ''Assembler-F'' benutzen oder aber den ''Tachyon Legacy Assembler'' verwenden, welcher unter [[zLinux|Linux für z/Series]] läuft. Für die Mikrocontrollerfamilie [[Intel MCS-51|MCS-51]] von Intel, deren erster Vertreter der [[8051]] war, gibt es den freien Macroassembler ASEM-51. Heute gibt es bereits hunderte von 8051-Derivaten von über 50 [[Halbleiterhersteller]]n.


== Weblinks ==
Auf [[IBM]]-[[Großrechner]]n ([[zSeries]]) wird der ''High Level Assembler'' verwendet, [[Hercules (Emulator)|Hercules]]-Anwender müssen entweder den veralteten Assembler ''Assembler-F'' benutzen oder aber den ''Tachyon Legacy Assembler'' verwenden, welcher unter [[Linux]] für [[z/Series]] läuft.
{{Wikibooks|Assembler-Programmierung für x86-Prozessoren}}
* [http://www.plantation-productions.com/Webster/www.artofasm.com/index.html ''The Art of Assembly Language Programming''.] (englisch)
* [http://www.codingcrew.de/masm32 MASM32-Package]
* [http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html GCC-Inline-Assembly-HOWTO] (englisch)
* [http://www.i8086.de/asm/8086-88-asm.html i8086.de 8086/88 Assembler Befehlsreferenz]
* [http://assembler.hpfsc.de/ Kurze Einführung]


== Einzelnachweise ==
Für die Mikrocontrollerfamilie [http://developer.intel.com/design/mcs51/ MCS-51] von Intel, deren erster Vertreter der [[8051]] war, gibt es den freien Macroassembler [http://plit.de/asem-51/ ASEM-51]. Heute gibt es bereits hunderte von 8051-Derivaten von über einem Dutzend [[Halbleiter]]herstellern.
<references />

''Siehe auch:'' [[Betriebssystem]]

== Weblinks ==
* [http://www.masm32.de/ MASM32 (Microsoft Macro Assembler)]
* [http://nasm.sourceforge.net/ NASM (Netwide Assembler)]
* [http://flatassembler.net/ FASM (Flat Assembler)]
* [http://www.tortall.net/projects/yasm/ YASM]
* [http://plit.de/asem-51/ ASEM-51 (8051 Macro Assembler)]
* [http://webster.cs.ucr.edu/AoA.html The Art of Assembly Language Programming]
* [http://www.robsite.de/tutorials.php?tut=assembly Tutorials]
* [http://raven.ra.ohost.de/raven-worx/tutorials/DLL/index.html Tutorial zum erstellen einer DLL]
* [http://www.planet-source.de/index.php?option=com_simpleboard&Itemid=26&func=showcat&catid=21 Assembler Forum]
* [http://linuxassembly.org/ Assembler unter Linux]
* [http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html GCC-Inline-Assembly-HOWTO]


[[Kategorie:Assembler| ]]
[[Kategorie:Assembler| ]]


[[en:Assembler]]
[[pt:Assembler]]
[[es:Ensamblador]]
[[he:אסמבלר]]
[[lt:Asembleris]]
[[pl:Asembler]]
[[ru:&#1040;&#1089;&#1089;&#1077;&#1084;&#1073;&#1083;&#1077;&#1088;]]
[[sv:Assembler]]

Aktuelle Version vom 13. März 2025, 09:42 Uhr

Ein Assembler (auch Assemblierer[1]) ist ein Computerprogramm, das Quelltext in Maschinensprache übersetzt. Der Quelltext eines Assemblerprogramms ist in Textform mit Hilfe mnemonischer Symbole in Assemblersprache geschrieben. Assembler zählen zu den von Programmierern verwendeten Werkzeugen.

Der erste Quelltext, in dem Assemblersprache zur Darstellung von Maschinencode verwendet wird, findet sich in Kathleen und Andrew Donald Booths 1947 erschienenem Werk “Coding for A.R.C.”.[2] Der erste Assembler wurde zwischen 1948 und 1950 von Nathaniel Rochester auf dem Computersystem IBM 701 implementiert.

Immer mehr an maschinennaher Programmierung – die Domäne von Assemblersprache – kann heute fast vollständig durch höhere Programmiersprachen abgedeckt werden. Auch steht der Möglichkeit der Erstellung effizienter Programme die erschwerte Wartbarkeit von Assemblerprogrammen gegenüber. Für optimalen Code wird immer mehr Kontextwissen benötigt (zum Beispiel: Cachenutzung, Lokalität, temporale Nutzung etc.). Ein Beispiel hierfür wäre der SSE-Befehl movntq, welcher wegen fehlenden Kontextwissens nicht oder nur sehr spekulativ von Compilern eingesetzt werden kann. Auf der anderen Seite benutzen die meisten Compiler für höhere Programmiersprachen nur einen kleinen Teil des Befehlssatzes der CPU (ein Sachverhalt, der zur Entwicklung von RISC-Prozessoren geführt hat), während dem Assemblerprogrammierer der vollständige Befehlssatz zur Verfügung steht, sodass er in manchen Situationen effizientere Befehle benutzen kann, die dem reinen Hochsprachenprogrammierer nicht zugänglich sind. Einige Programmiersysteme für höhere Programmiersprachen gestatten es, Assemblersprachenbefehle mittels Inline-Assembler in den Quelltext zu integrieren. Die Anwendung kann sich dann auf die Situationen beschränken, in denen es aus funktionalen oder Effizienzgründen notwendig oder nützlich ist, maschinennah zu programmieren. Zu beachten ist, dass verschiedene Prozessorarchitekturen grundverschiedene Assembler- und Maschinensprachen haben, so dass jeweils ein zur aktuellen Architektur passender Assembler benötigt wird und die Programme nicht oder nur unter großen Einschränkungen portabel sind. Makroassembler gestatten die Bildung von parametrisierbaren Anweisungen. Eine Makroanweisung wird im Allgemeinen in mehr als einen Maschinenbefehl umgesetzt.

Abgrenzung zu Hochsprachencompilern

[Bearbeiten | Quelltext bearbeiten]

Assembler sind immer spezifisch auf einen oder wenige Prozessortypen ausgerichtet. Für die IA32-Architektur unterscheiden sich Assembler und Assemblersprache beispielsweise vollständig von dem für die MIPS-Architektur. Manche Hochsprachencompiler übersetzen ein Programm zuerst in Assemblersprache und rufen dann einen Assembler zur Erzeugung von Maschinensprache auf. Während sich Hochsprachen eher an der menschlichen Sprache orientieren und somit verhältnismäßig leicht verständlich sind, orientiert sich Assemblersprache eng an der Maschine. In Assemblersprache entsprechen die Opcodes und die Referenz von Datenfeldern (wie add BETRAG,SUMME) als sogenannte Mnemonics dem Befehlssatz der jeweiligen CPU; dessen Verständnis ist somit bei Assembler Voraussetzung. Dagegen muss man sich in einer Hochsprache kaum oder überhaupt nicht um die darunterliegende CPU kümmern. Auch werden an einen Compiler ganz andere Ansprüche zum Erfassen des Laufzeitverhaltens eines Programms gestellt, besonders beim Treffen auf rekursive Funktionen, oder große Mengen zusätzlichen Quellcodes generiert (etwa Templates), teilweise auch bereits beim Kompilieren Code ausgeführt (Compile-Time-Function-Evaluation).

Obwohl vereinfacht und nicht immer zutreffend wird die Unterscheidung häufig darin gesehen, dass ein Compiler einzelne Anweisungen im Quelltext in jeweils mehrere Maschinenbefehle überführt, während bei einem Assembler hierbei typischerweise eine Eins-zu-Eins-Abbildung vorliegt.[3]

Aufgaben eines Assembler

[Bearbeiten | Quelltext bearbeiten]
  • Umsetzen von Befehlsmnemonics in der Anweisung einer Assemblersprache – beispielsweise den Befehlscode „CLI“ in den Befehlscode „11111010“ (hexadezimal 'FA') einer Maschinensprache
  • Umsetzen von Datenmnemonics in deren binäre Repräsentation – beispielsweise „BETRAG“ in Adresse=4711 und Länge=8
  • Verwaltung von Konstanten
  • Verwaltung von Adressen von Befehlen oder Daten
  • Berechnen von zur Übersetzungszeit feststehenden Konstanten mov eax, 4*5 + 6*7 + OFFSET ProgrammStart
  • Ignorieren von Kommentaren bei der Codegenerierung
  • Inkludieren anderer Programmcode-Dateien
  • Interpretieren und Transformieren von Makrocode
  • Bedingtes Übersetzen
  • Bündeln von zusammengehörenden Daten (z. B. schreibgeschützte Daten)
  • Zurückweisen von für diesen Prozessor oder Modus nicht erlaubten Befehlen
  • Einbinden von Debugging-Informationen oder anderen Metadaten
  • Erzeugen von Übersetzungs-Listings
  • Erzeugen von Maschinencode, ggf. als Objektdateien für zweistufige Übersetzungsprozesse mit Linker und der Möglichkeit zur Einbindung weiterer Programmteile (z. B. Unterprogrammen) aus Bibliotheken

Cross-Assembler

[Bearbeiten | Quelltext bearbeiten]

Ein Cross-Assembler ist eine Spezialform des Assemblers, der auf einer Computerplattform H (Host) läuft und Maschinencode für eine andere Computerplattform T (Target) erzeugt. Er ist damit ein spezieller Cross-Compiler. Cross-Assembler kommen heute vor allem bei der Entwicklung eingebetteter Systeme zum Einsatz, um schnellen und kompakten Code für Mikrocontroller und DSPs zu erstellen. Ein Beispiel ist der Cross-Assembler ASEM-51, der auf den Hostplattformen MS-DOS, Windows und Linux läuft. Er erzeugt Code für die Mikrocontrollerfamilie MCS-51 von Intel (Zielplattform).

Ein Programm zum Rückübersetzen von Maschinensprache in Assemblersprache wird als Disassembler bezeichnet. Diese Rückübersetzung ist möglich, da es – anders als bei Hochsprachen – eine Eins-zu-Eins-Beziehung zwischen einfacher Assemblersprache und Maschinensprache gibt. Dabei können jedoch Bezeichner und Kommentare nicht wiederhergestellt werden, da diese durch die Assemblierung verloren gehen. Meist werden Assemblersprachen um Makrofunktionalitäten ergänzt, so dass diese direkte Abbildung nur noch teilweise möglich ist.

Maschinensprachemonitor

[Bearbeiten | Quelltext bearbeiten]

Auf einigen Plattformen existiert eine sehr einfache Version eines Assemblers, kombiniert mit der Möglichkeit, Programme interaktiv zu testen und zu analysieren, die Maschinensprachemonitor genannt wird.

Hersteller und Produkte

[Bearbeiten | Quelltext bearbeiten]

Für die x86-Prozessoren-Familie und kompatible Prozessoren (zum Beispiel Intels Pentium oder AMDs Athlon) sind der Microsoft Macro Assembler (MASM), der Borland Turbo Assembler (TASM) und der Netwide Assembler (NASM) weit verbreitet. Auch der Flat Assembler (FASM) bietet viele Features, die ein moderner Assembler benötigt. Yasm schließlich ist ein Rewrite von NASM unter BSD-Lizenz. Neben Assemblern, die die Intel-Syntax kennen, gibt es noch solche, die Assemblercode in der AT&T-Syntax assemblieren können, wie den unter Linux hauptsächlich genutzten GNU Assembler (GAS). GAS unterstützt ab Version 2.10 über die .intel_syntax Direktive auch die Intel-Syntax.[4][5][6] Auf IBM-Großrechnern (System z) wird der High Level Assembler verwendet, Hercules-Anwender müssen entweder den veralteten Assembler Assembler-F benutzen oder aber den Tachyon Legacy Assembler verwenden, welcher unter Linux für z/Series läuft. Für die Mikrocontrollerfamilie MCS-51 von Intel, deren erster Vertreter der 8051 war, gibt es den freien Macroassembler ASEM-51. Heute gibt es bereits hunderte von 8051-Derivaten von über 50 Halbleiterherstellern.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. DIN 44300.
  2. Andrew D Booth, Kathleen HV Britten: Coding for A.R.C. Institute for Advanced Study, Princeton, 1947 (englisch, ias.edu [PDF; abgerufen am 4. November 2022]).
  3. Peter Calingaert: Assemblers, compilers, and program translation. Computer Science Press, Potomac, MD, 1979. ISBN 0-914894-23-4. S. 186–187
  4. Ram Narayam: Linux assemblers: A comparison of GAS and NASM. 17. Oktober 2007, abgerufen am 2. Juli 2008 (englisch).
  5. Randall Hyde: Which Assembler is the Best? Abgerufen am 18. Mai 2008 (englisch).
  6. GNU Assembler News, v2.1 supports Intel syntax. 4. April 2008, abgerufen am 2. Juli 2008 (englisch).