www.wikidata.de-de.nina.az
Eine Assemblersprache kurz auch Assembler genannt von englisch to assemble zusammenfugen ist eine Programmiersprache die auf den Befehlsvorrat eines bestimmten Computertyps d h dessen Prozessorarchitektur ausgerichtet ist Assemblersprachen bezeichnet man deshalb als maschinenorientierte Programmiersprachen und als Nachfolger der direkten Programmierung mit Zahlencodes als Programmiersprachen der zweiten Generation Anstelle eines Binarcodes der Maschinensprache konnen Befehle und deren Operanden durch leichter verstandliche mnemonische Symbole in Textform z B MOVE Operanden z T als symbolische Adresse z B PLZ notiert und dargestellt werden 1 Der Quelltext eines Assemblerprogramms wird mit Hilfe einer Ubersetzungssoftware Assembler oder Assemblierer in Maschinencode ubersetzt Dagegen ubersetzt in hoheren Programmiersprachen Hochsprachen dritte Generation ein sogenannter Compiler abstraktere komplexere nicht auf den Prozessor Befehlssatz begrenzte Befehle in den Maschinencode der gegebenen Zielarchitektur oder in eine Zwischensprache 2 Umgangssprachlich werden die Ausdrucke Maschinensprache und Assembler sprache haufig synonym verwendet Inhaltsverzeichnis 1 Ubersicht 2 Beschreibung 3 Beispielprogramm 4 Verschiedene Assemblersprachen 5 Geschichte 6 Vergleich zur Programmierung in einer Hochsprache 6 1 Nachteile 6 2 Vorteile 7 Siehe auch 8 Literatur 9 Weblinks 10 EinzelnachweiseUbersicht BearbeitenEin Quelltext in Assemblersprache wird auch als Assemblercode bezeichnet Programme in Assemblersprachen zeichnen sich dadurch aus dass alle Moglichkeiten des Mikroprozessors genutzt werden konnen was heutzutage selten erforderlich ist Sie werden im Allgemeinen nur noch dann verwendet wenn Programme bzw einzelne Teile davon sehr zeitkritisch sind z B beim Hochleistungsrechnen oder bei Echtzeitsystemen Ihre Nutzung kann auch dann sinnvoll sein wenn fur die Programme nur sehr wenig Speicherplatz zur Verfugung steht z B in eingebetteten Systemen Unter dem Aspekt der Geschwindigkeitsoptimierung kann der Einsatz von Assemblercode auch bei verfugbaren hochoptimierenden Compilern noch seine Berechtigung haben Vor und Nachteile sollten aber fur die spezifische Anwendung abgewogen werden Bei komplexer Technik wie Intel Itanium und verschiedenen digitalen Signalprozessoren kann ein Compiler u U durchaus besseren Code erzeugen als ein durchschnittlicher Assemblerprogrammierer da das Ablaufverhalten solcher Architekturen mit komplexen mehrstufigen intelligenten Optimierungen z B Out of order execution Pipeline Stalls hochgradig nichtlinear ist Die Geschwindigkeitsoptimierung wird immer komplexer da zahlreiche Nebenbedingungen eingehalten werden mussen Dies ist ein gleichermassen wachsendes Problem sowohl fur die immer besser werdenden Compiler der Hochsprachen als auch fur Programmierer der Assemblersprache Fur einen optimalen Code wird immer mehr Kontextwissen benotigt z B Cachenutzung raumliche und zeitliche Lokalitat der Speicherzugriffe welches der Assemblerprogrammierer teilweise im Gegensatz zum Compiler durch Laufzeitprofiling des ausgefuhrten Codes in seinem angestrebten Anwendungsfeld gewinnen kann Ein Beispiel hierfur ist der SSE Befehl MOVNTQ welcher wegen des fehlenden Kontextwissens von Compilern kaum optimal eingesetzt werden kann Die Ruckwandlung von Maschinencode in Assemblersprache wird Disassemblierung genannt Der Prozess ist allerdings verlustbehaftet bei fehlenden Debug Informationen hochgradig verlustbehaftet da sich viele Informationen wie ursprungliche Bezeichner oder Kommentare nicht wiederherstellen da diese beim Assemblieren nicht in den Maschinencode ubernommen wurden oder berechnet wurden Beschreibung BearbeitenProgrammbefehle in Maschinensprache bilden sich aus dem Operationscode Opcode und meist weiteren je nach Befehl individuell festgelegten Angaben wie Adressen im Befehl eingebettete Literale Langenangaben etc Da die Zahlenwerte der Opcodes schwierig zu merken sind verwenden Assemblersprachen leichter merkbare Kurzel sogenannte mnemonische Symbole kurz Mnemonics 3 Beispiel Der folgende Befehl in der Maschinensprache von x86 Prozessoren 10110000 01100001 in hexadezimaler Darstellung B0 61 entspricht dem Assemblerbefehl movb 0x61 al AT amp T Syntax alles nach ist Kommentar mnemonisches Kurzel bedeutet move byte von was nach bzw mov al 61 h Intel Syntax das mov als mnemotechnisches Kurzel erkennt aus dem angesprochenen al dass nur 1 Byte kopiert werden soll mov wohin was woher und bedeutet dass der hexadezimale Wert 61 dezimal 97 in den niederwertigen Teil des Registers ax geladen wird ax bezeichnet das ganze Register al fur low den niederwertigen Teil des Registers Der hochwertige Teil des Registers kann mit ah angesprochen werden fur high Am Beispiel ist zu erkennen dass obwohl in denselben Maschinencode ubersetzt wird die beiden Assembler Dialekte deutlich verschieden formulieren Die Information dass ein Byte zu kopieren ist steckt bei AT amp T im movb der Intel mov entnimmt sie dem Umstand dass Register teil al ein Byte gross ist Quelle und Ziel des Kopierens werden vertauscht angegeben Auch das Format zum Ansprechen eines Registers sowie zur Angabe eines direkten Zahlenwerts ist verschieden Mit Computerhilfe kann man das eine in das andere weitgehend eins zu eins ubersetzen Jedoch werden Adressumformungen vorgenommen so dass man symbolische Adressen benutzen kann Die Eingabedaten fur einen Assembler enthalten neben den eigentlichen Codes Befehlen die er in Maschinencode ubersetzt auch Steueranweisungen die seine Arbeitsweise bestimmen festlegen zum Beispiel zur Definition eines Basisregisters Haufig werden komplexere Assemblersprachen Makroassembler verwendet um die Programmierarbeit zu erleichtern Makros sind dabei im Quelltext enthaltene Aufrufe die vor dem eigentlichen Assemblieren automatisch durch meist kurze Folgen von Assemblerbefehlen ersetzt werden Dabei konnen einfache durch Parameter steuerbare Ersetzungen vorgenommen werden Die Disassemblierung von derart generiertem Code ergibt allerdings den reinen Assemblercode ohne die beim Ubersetzen expandierten Makros Beispielprogramm BearbeitenEin sehr einfaches Programm das zu Demonstrationszwecken haufig benutzte Hallo Welt Beispielprogramm kann zum Beispiel in der Assemblersprache MASM fur MS DOS aus folgendem Assemblercode bestehen ASSUME CS CODE DS DATA dem Assembler die Zuordnung der Segmentregister zu den Segmenten mitteilen DATA SEGMENT Beginn des Datensegments Meldung db Hallo Welt Zeichenkette Hallo Welt db 13 10 Neue Zeile db Zeichen das die Textausgabefunktion INT 21h Unterfunktion 09h als Zeichenkettenende versteht DATA ENDS Ende des Datensegments CODE SEGMENT Beginn des Codesegments Anfang Einsprung Label fuer den Anfang des Programms mov ax DATA Adresse des Datensegments in das Register AX laden mov ds ax In das Segmentregister DS uebertragen das DS Register kann nicht direkt mit einem Wert beschrieben werden mov dx OFFSET Meldung die zum Datensegment relative Adresse des Textes in das DX Datenregister laden die vollstaendige Adresse von Meldung befindet sich nun im Registerpaar DS DX mov ah 09 h die Unterfunktion 9 des Betriebssysteminterrupts 21h auswaehlen Textausgaberoutine int 21 h den Betriebssysteminterrupt 21h aufrufen hier erfolgt die Ausgabe des Textes am Schirm mov ax 4 C00h die Unterfunktion 4Ch Programmbeendigung des Betriebssysteminterrupts 21h festlegen int 21 h damit wird die Kontrolle wieder an das Betriebssystem zurueckgegeben Programmende CODE ENDS Ende des Codesegments END Anfang dem Assembler und Linkprogramm den Programm Einsprunglabel mitteilen dadurch erhaelt der Befehlszaehler beim Aufruf des Programmes diesen Wert Vergleichende Gegenuberstellungen fur das Hallo Welt Programm in unterschiedlichen Assemblerdialekten enthalt diese Liste In einem Pascal Quelltext eine Hochsprache kann der Programmcode fur Hallo Welt dagegen deutlich kurzer sein program Hallo output begin writeln Hallo Welt end Verschiedene Assemblersprachen BearbeitenJede Computerarchitektur hat ihre eigene Maschinensprache und damit Assemblersprache Mitunter existieren auch mehrere Assemblersprachen Dialekte verschiedene Assemblersprachen sowie zugehorige Assembler fur die gleiche Prozessorarchitektur Die Sprachen verschiedener Architekturen unterscheiden sich in Anzahl und Typ der Operationen Jedoch haben alle Architekturen die folgenden grundlegenden Operationen Daten lesen und schreiben von nach Hauptspeicher in aus dem Prozessor i A von zu einem Register fast immer auch von Register zu Register meistens auch von Hauptspeicher zu Hauptspeicher einfache logische Operationen z B Bit Operationen wie AND OR NOT SHIFT einfache Kontrolle des Programmflusses v a durch Prozessor Flag bedingte Sprunge einfache arithmetische Operationen z B Ganzzahl Addition Ganzzahl Vergleich Bestimmte Rechnerarchitekturen haben oft auch komplexere Befehle CISC wie z B Aufrufe von Ein bzw Ausgabegeraten eine einfache Operation z B Addition auf einen Vektor von Werten anwenden Speicherblock Operationen z B kopieren oder mit Nullen fullen hohere Arithmetik Befehle die durch mehrere einfache nachgebaut werden konnten z B Verringere Wert in Register A um 1 wenn es nun 0 ist springe an Programmstelle xyz DJZ A xyz decrement A Jump if Zero to xyz Gleitkomma Arithmetik wie Gleitkomma Addition Multiplikation Sinus Kosinus und Wurzelberechnung entweder uber spezielle Zusatzprozessoren realisiert oder uber Softwareroutinen massive direkte Parallelprogrammierbarkeit des Prozessors etwa bei digitalen Signalprozessoren Synchronisation mit anderen Prozessoren fur SMP Systeme Unterbrechungssteuerungen die besonders fur Prozessrechner benotigt werden Geschichte BearbeitenDie erste Assemblersprache wurde 1947 von Kathleen Booth entwickelt 4 5 Sie entwarf im Anschluss den Assembler fur die ersten Computersysteme am Birkbeck College der University of London Zwischen 1948 und 1950 schrieb Nathaniel Rochester einen der fruhsten symbolischen Assembler fur eine IBM 701 In den 1980er und fruhen 1990er Jahren wechselte die Sprache in der Betriebssysteme fur grossere Rechner geschrieben wurden von Assembler zu Hochsprachen hin meist C aber auch C oder Objective C Hauptausloser war die steigende Komplexitat von Betriebssystemen bei grosserem verfugbaren Speicher im Bereich oberhalb von einem Megabyte In Assembler verblieben zum Beispiel das Zwischenspeichern von Registern bei Prozesswechsel siehe Scheduler oder bei der x86 Architektur der Teil des Boot Loaders der innerhalb des 512 Byte grossen Master Boot Records untergebracht sein muss Auch Teile von Geratetreibern werden in Assemblersprache geschrieben falls aus den Hochsprachen kein effizienter Hardware Zugriff moglich ist Manche Hochsprachencompiler erlauben es direkt im eigentlichen Quellcode Assemblercode sogenannte Inline Assembler einzubetten Bis ca 1990 wurden die meisten Computerspiele in Assemblersprachen programmiert da nur so auf Heimcomputern und den damaligen Spielkonsolen eine akzeptable Spielgeschwindigkeit und eine den kleinen Speicher dieser Systeme nicht sprengende Programmgrosse zu erzielen war Noch heute gehoren Computerspiele zu den Programmen bei denen am ehesten kleinere assemblersprachliche Programmteile zum Einsatz kommen um so Prozessorerweiterungen wie SSE zu nutzen Bei vielen Anwendungen fur Gerate die von Mikrocontrollern gesteuert sind war fruher oft eine Programmierung in Assembler notwendig um die knappen Ressourcen dieser Mikrocontroller optimal auszunutzen Um Assemblercode fur solche Mikrocontroller zu Maschinencode zu ubersetzen werden Cross Assembler bei der Entwicklung eingesetzt Heute sind Mikrocontroller so gunstig und leistungsfahig dass moderne C Compiler auch in diesem Bereich die Assembler weitgehend abgelost haben Nicht zuletzt aufgrund grosserer Programmspeicher bei geringen Aufpreisen fur die Chips fallen die Vorteile von Hochsprachen gegenuber den teils geringen Vorteilen der Assemblersprache immer mehr ins Gewicht Vergleich zur Programmierung in einer Hochsprache BearbeitenNachteile Bearbeiten Assemblerprogramme sind sehr hardwarenah geschrieben da sie direkt die unterschiedlichen Spezifikationen und Befehlssatze der einzelnen Computerarchitekturen Prozessorarchitektur abbilden Daher kann ein Assemblerprogramm im Allgemeinen nicht auf ein anderes Computersystem andere Prozessorarchitektur ubertragen werden ohne dass der Quelltext angepasst wird Das erfordert abhangig von den Unterschieden der Assemblersprachen hohen Umstellungsaufwand unter Umstanden ist ein komplettes Neuschreiben des Programmtextes erforderlich Im Gegensatz dazu muss bei Hochsprachen oft nur ein Compiler fur die neue Zielplattform verwendet werden Quelltexte in Assemblersprache sind fast immer deutlich langer als in einer Hochsprache da die Instruktionen weniger komplex sind und deshalb gewisse Funktionen Operationen mehrere Assemblerbefehle erfordern z B mussen beim logischen Vergleich von Daten gt lt ungleiche Datenformate oder Langen zunachst angeglichen werden Die dadurch grossere Befehlsanzahl erhoht das Risiko unubersichtlichen schlecht strukturierten und schlecht wartbaren Programmcode herzustellen Vorteile Bearbeiten Nach wie vor dient Assembler zur Mikro Optimierung von Berechnungen fur die der Hochsprachencompiler nicht ausreichend effizienten Code generiert 6 7 In solchen Fallen konnen Berechnungen effizienter direkt in Assembler programmiert werden Beispielsweise sind im Bereich des wissenschaftlichen Rechnens die schnellsten Varianten mathematischer Bibliotheken wie BLAS 8 9 oder bei architekturabhangigen Funktionen wie der C Standardfunktion memcpy 10 11 weiterhin die mit Assembler Code Auch lassen sich gewisse sehr systemnahe Operationen unter Umgehung des Betriebssystems z B direktes Schreiben in den Bildschirmspeicher nicht in allen Hochsprachen ausfuhren Der Nutzen von Assembler liegt auch im Verstandnis der Arbeits und Funktionsweise eines Systems das durch Konstrukte in Hochsprachen versteckt wird Auch heute noch wird an vielen Hochschulen Assembler gelehrt um ein Verstandnis fur die Rechnerarchitektur und seine Arbeitsweise zu bekommen Siehe auch BearbeitenC eine portable AssemblerspracheLiteratur BearbeitenGerhard Niemeyer Einfuhrung in das Programmieren in ASSEMBLER Systeme IBM Siemens Univac Comparex IBM PC 370 6 bearbeitete und erweiterte Auflage de Gruyter Berlin u a 1989 ISBN 3 11 012174 3 De Gruyter Lehrbuch Joachim Rohde Assembler ge packt Schnelles und effektives Nachschlagen aller relevanten Befehlssatze fur AMD und Intel MMX und 3DNow SSE und seine Erweiterungen 2 aktualisierte Auflage Mitp Verlag Heidelberg 2007 ISBN 978 3 8266 1756 0 Die ge packte Referenz Joachim Rohde Marcus Roming Assembler Grundlagen der Programmierung Theorie und Praxis unter DOS und Windows MMX und 3DNOW Programme optimieren und Reverse Engineering 2 aktualisierte und erweiterte Auflage Mitp Verlag Bonn 2006 ISBN 3 8266 1469 0 3 8266 1469 0 Jeff Duntemann Assembly Language Step by Step Programming with DOS and Linux 2 Auflage Wiley New York NY u a 2000 ISBN 0 471 37523 3 mit 1 CD ROM Paul Carter PC Assembly Language 2001 Robert Britton MIPS Assembly Language Programming Prentice Hall Upper Saddle River NJ 2003 ISBN 0 13 142044 5 Steve McConnell Code Complete A practical Handbook of Software Construction Microsoft Press Redmond WA 1993 ISBN 1 55615 484 4 Randall Hyde The Art of Assembly Language 2 Auflage No Starch Press 2010 ISBN 978 1593272074 Weblinks Bearbeiten nbsp Wiktionary Assemblersprache Bedeutungserklarungen Wortherkunft Synonyme Ubersetzungen nbsp Wikibooks Assembler Programmierung Lern und Lehrmaterialien Ed Jorgensen x86 64 Assembly Language Programming with Ubuntu PDF 2 4 MB Compiler Explorer interaktive Ubersetzung verschiedener Ausgangssprachen im Webbrowser englisch Einzelnachweise Bearbeiten Informatik Duden ISBN 3 411 05232 5 Hering Gutekunst Dyllon Handbuch der praktischen und technischen Informatik S 302 books google de Jorg Roth Die Maschinenprogrammebene eines Rechners Kapitel Maschinensprache und Assembler Archiv Version vom 17 Oktober 2018 abgerufen am 19 November 2020 Steven Dufresne Kathleen Booth Assembling Early Computers While Inventing Assembly 21 August 2018 archiviert vom Original am 24 Marz 2020 abgerufen am 10 Februar 2019 englisch Andrew Donald Booth Kathleen Hylda Valerie Britten General considerations in the design of an all purpose electronic digital computer 2 Auflage Birkbeck College London The Institute for Advanced Study Princeton New Jersey USA September 1947 englisch Online PDF abgerufen am 10 Februar 2019 The non original ideas contained in the following text have been derived from a number of sources It is felt however that acknowledgement should be made to Prof John von Neumann and to Dr Herman Goldstein for many fruitful discussions Mans Rullgard Bit field badness hardwarebug org 30 Januar 2010 archiviert vom Original am 5 Februar 2010 abgerufen am 4 Marz 2010 englisch Mans Rullgard GCC makes a mess hardwarebug org 13 Mai 2009 archiviert vom Original am 16 Marz 2010 abgerufen am 4 Marz 2010 englisch John Markoff Writing the Fastest Code by Hand for Fun A Human Computer Keeps Speeding Up Chips New York Times 28 November 2005 abgerufen am 4 Marz 2010 englisch BLAS Benchmark August2008 eigen tuxfamily org 1 August 2008 abgerufen am 4 Marz 2010 englisch Mike Wall Using Block Prefetch for Optimized Memory Performance 2001 Archiv Version PDF 136 kB mit edu archiviert vom Original am 30 August 2017 abgerufen am 19 November 2020 englisch Agner Fog Optimizing subroutines in assembly language PDF 873 kB Copenhagen University College of Engineering 29 Februar 2012 S 100 abgerufen am 22 September 2012 englisch 12 11 Loop unrolling Normdaten Sachbegriff GND 4003255 3 lobid OGND AKS Abgerufen von https de wikipedia org w index php title Assemblersprache amp oldid 235206346