Montagesprache
Paradigma | Imperativ, unstrukturiert, häufig Metaprogrammierung (durch Makros), bestimmte Versammler, sind objektorientierter und/oder strukturiert |
---|---|
Erstmals erschienen | 1947 |
Disziplin tippen | Keiner |
Dateiname -Erweiterungen | .asm , .s , .inc , .Wla , .Src und einige andere je nach Assembler |
Im Computerprogrammierung, Montagesprache (oder Assemblersprache,[1] oder Symbolischer Maschinencode[2][3][4]), oft einfach als als Montage und häufig abgekürzt wie Asm oder Asm, ist jeder Programmiersprache mit niedriger Ebene mit einer sehr starken Korrespondenz zwischen den Anweisungen in der Sprache und der Architektur Maschinensprache Anweisungen.[5] Montagesprache hat normalerweise eine Aussage pro Maschinenanweisung (1: 1), aber Konstanten, Kommentare, Assembler Richtlinien,[6] symbolisch Etiketten von z. B.,, Speicherorte, Register, und Makros[7][1] werden im Allgemeinen auch unterstützt.
Der Montagecode wird durch a in ausführbarer Maschinencode konvertiert Dienstprogramm als als bezeichnet Assembler. Der Begriff "Assembler" wird im Allgemeinen zugeschrieben Wilkes, Wheeler und Kieme In ihrem Buch von 1951 Die Vorbereitung von Programmen für einen elektronischen digitalen Computer,[8] WHO nutzte jedoch den Begriff, "ein Programm, das ein anderes Programm zusammenstellt, das aus mehreren Abschnitten in einem einzigen Programm besteht".[9] Der Konvertierungsprozess wird als bezeichnet als Montage, wie in Zusammenstellung das Quellcode. Der rechnerische Schritt, wenn ein Assembler ein Programm bearbeitet Montagezeit.
Da die Baugruppe von den Anweisungen für Maschinencode abhängt, jede Montagesprache[NB 1] ist spezifisch für eine bestimmte Rechnerarchitektur.[10][11][12]
Manchmal gibt es mehr als einen Assembler für dieselbe Architektur, und manchmal ist ein Assembler spezifisch für eine Betriebssystem oder zu bestimmten Betriebssystemen. Die meisten Montagesprachen bieten nicht spezifisch Syntax Für Betriebssystemaufrufe und die meisten Montagesprachen können allgemein mit jedem Betriebssystem verwendet werden.[NB 2] Da die Sprache den Zugang zu allen tatsächlichen Fähigkeiten des Prozessor, auf was alle Systemanruf Mechanismen ruhen letztendlich. Im Gegensatz zu Montagesprachen die meisten hochrangige Programmiersprachen sind im Allgemeinen tragbar über mehrere Architekturen hinweg, erfordern aber Interpretation oder Kompilierenviel kompliziertere Aufgaben als zusammenzubauen.
In den ersten Jahrzehnten des Computers war es für beide alltäglich Systemprogrammierung und Anwendungsprogrammierung vollständig in der Versammlungssprache stattfinden. Während einige Zwecke immer noch unersetzlich sind, wird der Großteil der Programmierung nun in übergeordneten interpretierten und kompilierten Sprachen durchgeführt. Im "Keine silberne Kugel",", Fred Brooks Fassen Sie die Auswirkungen des Schalters von der Programmierung von Montagesprachen zusammen: "Der leistungsstärkste Schlaganfall für Softwareproduktivität, Zuverlässigkeit und Einfachheit war sicherlich die fortschreitende Verwendung von Sprachen auf hoher Ebene für die Programmierung. Fünf in der Produktivität und mit gleichzeitigen Gewinnen in Bezug auf Zuverlässigkeit, Einfachheit und Verständlichkeit. "[13]
Heutzutage ist es typisch, kleine Mengen an Montage-Sprachcode in größeren Systemen zu verwenden, die in einer höheren Sprache implementiert sind, aus Leistungsgründen oder direkt mit Hardware auf eine Weise, die von der Sprache auf höherer Ebene unterstützt wird, direkt mit Hardware interagieren. Zum Beispiel knapp 2% der Version 4.9 der Version Linux Kernel Der Quellcode ist in der Montage geschrieben; Mehr als 97% sind in geschrieben C.[14]
Assemblersprachensyntax
Montagesprache verwendet a mnemonisch z. B. jeden niedrigen Niveau darstellen Maschinenanweisung oder Opcode, jeder Richtlinie, normalerweise auch jeder Architekturregister, Flaggeusw. Einige der Mnemonik können eingebaut und einige Benutzer definiert werden. Viele Operationen erfordern einen oder mehrere Operanden Um eine vollständige Anweisung zu bilden. Die meisten Versammler erlauben benannte Konstanten, Register und Etiketten für Programm- und Speicherorte und können berechnen Ausdrücke Für Operanden. Daher werden Programmierer von mühsamen sich wiederholenden Berechnungen befreit und Assembler -Programme sind viel lesbarer als der Maschinencode. Abhängig von der Architektur können diese Elemente auch für bestimmte Anweisungen kombiniert werden oder Adressierungsmodi Verwendung Offsets oder andere Daten sowie feste Adressen. Viele Abbauler bieten zusätzliche Mechanismen an, um die Programmentwicklung zu erleichtern, den Montageprozess zu kontrollieren und zu helfen Debuggen.
Einige sind säulenorientiert mit bestimmten Feldern in bestimmten Spalten; Dies war sehr häufig für Maschinen, die verwendet wurden geschlagene Karten In den 1950er und frühen 1960er Jahren. Einige Abgänger haben eine Freiform-Syntax, wobei Felder durch Abgrenzer getrennt sind, z. B. Interpunktion, weißer Raum. Einige Assembler sind hybrid mit, z. B. Beschriftungen in einer bestimmten Säule und anderen Feldern, die durch Abgrenzer getrennt sind; Dies wurde in den 1960er Jahren häufiger als die säulenorientierte Syntax.
IBM System/360
Alle IBM -Assembler für System/360Haben Sie standardmäßig eine Etikett in Spalte 1, Felder in Spalten 2-71, einen Fortsetzungsindikator in Spalte 72 und eine Sequenznummer in den Spalten 73-80. Der Trennzeichen für Etikett, Opcode, Operanden und Kommentare sind Räume, während einzelne Operanden durch Kommas und Klammern getrennt werden.
Terminologie
- A Makro -Assembler ist ein Assembler, der a enthält Makrostruktur Einrichtung, damit (parametrisierter) Assembler -Sprachtext durch einen Namen dargestellt werden kann und dieser Name verwendet werden kann, um den erweiterten Text in einen anderen Code einzufügen.
- Code öffnen Bezieht sich auf jeden Assemblereingang außerhalb einer Makrodefinition.
- A Cross Assembler (siehe auch Cross Compiler) ist ein Assembler, der auf einem Computer ausgeführt wird oder Betriebssystem (das Gastgeber System) eines anderen Typs als das System, auf dem der resultierende Code ausgeführt wird (die Zielsystem). Cross-Assembling erleichtert die Entwicklung von Programmen für Systeme, die nicht über die Ressourcen verfügen, um die Softwareentwicklung zu unterstützen, wie z. Eingebettetes System oder ein Mikrocontroller. In einem solchen Fall die resultierenden Objektcode muss über übertragen werden über das Zielsystem übertragen werden Nur-Lese-Speicher (ROM, Epromusw.), a Programmierer (Wenn der schreibgeschützte Speicher wie in Mikrocontrollern in das Gerät integriert ist) oder eine Datenverbindung unter Verwendung einer exakten Bit-bit-Kopie des Objektcodes oder einer textbasierten Darstellung dieses Codes (wie z. B. Intel Hex oder Motorola S-Rekord).
- A hochrangiger Assembler ist ein Programm, das Sprachabstraktionen häufiger mit hochrangigen Sprachen, wie z.Wenn/dann/sonst, Do case usw.) und abstrakte Datentypen auf hoher Ebene, einschließlich Strukturen/Datensätze, Gewerkschaften, Klassen und Sets.
- A Mikroassembler ist ein Programm, das hilft, a vorzubereiten Mikroprogramm, genannt Firmware, um den niedrigen Betrieb eines Computers zu steuern.
- A Meta-Assembler ist "ein Programm, das die syntaktische und semantische Beschreibung einer Assemblersprache akzeptiert und einen Assembler für diese Sprache generiert",[15] oder das akzeptiert eine Assembler -Quelldatei zusammen mit einer solchen Beschreibung und montiert die Quelldatei gemäß dieser Beschreibung. "Meta-symbol" -Antsbler für die SDS 9 Serie und SDS Sigma -Serie Computer sind Meta-Assembler.[16][NB 3] Sperry Univac bot auch einen Meta-Assembler für die UNIVAC 1100/2200 Serie.[17]
- Inline -Assembler (oder eingebetteter Assembler) ist Assembler-Code in einem hochrangigen Sprachprogramm.[18] Dies wird am häufigsten in Systemprogrammen verwendet, die direkten Zugriff auf die Hardware benötigen.
Schlüssel Konzepte
Assembler
Ein Assembler Programm schafft Objektcode durch Übersetzung Kombinationen von Mnemonik und Syntax für Operationen und Adressierungsmodi in ihre numerischen Äquivalente. Diese Darstellung enthält typischerweise eine Betriebscode (""Opcode") sowie andere Kontrolle Bits und Daten. Der Assembler berechnet auch konstante Ausdrücke und löst sich auf Symbolische Namen für Speicherorte und andere Entitäten.[19] Die Verwendung symbolischer Referenzen ist ein wichtiges Merkmal von Assembern, das nach Programmänderungen mühsame Berechnungen und manuelle Adressaktualisierungen speichert. Die meisten Assembler umfassen auch Makro Einrichtungen zur Durchführung einer textlichen Substitution - z. B. um gemeinsame kurze Anweisungssequenzen als zu generieren in der Reihe, Anstatt von genannt Unterroutinen.
Einige Abgeordnete können möglicherweise auch einige einfache Arten von durchführen Befehlssatz-Spezifisch Optimierungen. Ein konkretes Beispiel dafür kann das allgegenwärtige sein x86 Abgeordnete aus verschiedenen Anbietern. Genannt Sprunggrößen,[19] Die meisten von ihnen sind in der Lage, auf Anfrage in einer beliebigen Anzahl von Pässen die Ersatz für Sprungstruktur (lange Sprünge ersetzt durch kurze oder relative Sprünge) durchzuführen. Andere können sogar eine einfache Umlagerung oder Einführung von Anweisungen durchführen, wie beispielsweise einige Abgeordnete für RISC Architekturen Das kann dazu beitragen, eine vernünftige Optimierung zu optimieren Anweisungsplanung Um die auszunutzen CPU -Pipeline so effizient wie möglich.[20]
Versammler sind seit den 1950er Jahren, als erster Schritt oberhalb der Maschinensprache und zuvor verfügbar hochrangige Programmiersprachen wie zum Beispiel Forran, Algol, Cobol und Lispeln. Es gab auch mehrere Übersetzer und halbautomatische Klassen Codegeneratoren mit Eigenschaften ähnlich sowohl der Assembly- als auch der hochrangigen Sprachen, mit SpeedCode als vielleicht eines der bekannteren Beispiele.
Es kann mehrere Assembler mit anderen geben Syntax für eine bestimmte Zentralprozessor oder Anweisungsset Architektur. Zum Beispiel eine Anweisung zum Hinzufügen von Speicherdaten zu einem Register in a x86-Familieprozessor könnte sein Fügen Sie EAX, [EBX] hinzu
in Original Intel -Syntaxwährend dies geschrieben würde Addl (%EBX),%eAx
in dem AT & T -Syntax verwendet von der GNU Assembler. Trotz unterschiedlicher Erscheinungen erzeugen verschiedene syntaktische Formen im Allgemeinen die gleiche Numerik Maschinensprache. Ein einzelner Assembler kann auch unterschiedliche Modi haben, um Variationen in syntaktischen Formen sowie deren genaue semantische Interpretationen (wie z. Fasm-Syntax, Tasm-Syntax, idealer Modus usw. im Sonderfall von x86 Montage Programmierung).
Anzahl der Durchgänge
Es gibt zwei Arten von Assembler, basierend darauf, wie viele durch die Quelle durchlaufen werden (wie oft der Assembler die Quelle liest), um die Objektdatei zu erstellen.
- Ein-Pass-Assembler Verarbeiten Sie den Quellcode einmal. Für Symbole, die vor ihrer Definition verwendet werden, wird der Assembler ausstrahlen "Errata" Nach der letztendlichen Definition das Erzählen der Linker oder der Lader, um die Stellen zu patchen, an denen die noch undefinierten Symbole verwendet wurden.
- Multi-Pass-Abgänger Erstellen Sie eine Tabelle mit allen Symbolen und deren Werten in den ersten Durchgängen und verwenden Sie die Tabelle in späteren Pässen, um Code zu generieren.
In beiden Fällen muss der Assembler in der Lage sein, die Größe jeder Anweisung für die Anfangspässe zu bestimmen, um die Adressen der nachfolgenden Symbole zu berechnen. Dies bedeutet, dass der Assembler bei der ersten Begegnung mit der Operation eine pessimistische Schätzung vornimmt, wenn die Größe einer Operation, die sich auf einen später definierten Operand bezieht, von der Art oder Entfernung des Operanden abhängt, und pad sie bei Bedarf mit einem oder mehreren. "keine Operation"Anweisungen in einem späteren Pass oder in der Errata. In einem Assembler mit Gucklochoptimierung, Adressen können zwischen den Durchgängen neu berechnet werden, um den pessimistischen Code durch den genauen Abstand zum Ziel zu ersetzen.
Der ursprüngliche Grund für die Verwendung von One-Pass-Ansammlern war die Speichergröße und -geschwindigkeit der Montage-häufig müsste ein zweiter Durchgang die Symboltabelle im Speicher speichern (um zu handhaben Vorwärtsreferenzen), Rückspulen und erneutes Lesen der Programmquelle auf Bandein Deck von Karten oder geschlagenes Papierband. Spätere Computer mit viel größeren Erinnerungen (insbesondere Disc-Speicher) hatten den Platz, um alle notwendigen Verarbeitung ohne eine solche erneute Lektüre durchzuführen. Der Vorteil des Mehrpass-Assemblers besteht darin, dass das Fehlen von Errata das macht Verknüpfungsprozess (oder der Programmlast Wenn der Assembler direkt ausführbarer Code erzeugt) schneller.[21]
Beispiel: Im folgenden Code-Snippet könnte ein Einpass-Assembler die Adresse der Rückwärtsreferenz bestimmen Bkwd Bei der Zusammenstellung der Erklärung S2, könnte aber nicht in der Lage sein, die Adresse der Vorwärtsreferenz zu bestimmen FWD Bei der Zusammenstellung der Zweiganweisung S1; in der Tat, FWD kann undefiniert sein. Ein Zweipass-Assembler würde beide Adressen in Pass 1 bestimmen, daher wären sie beim Generieren von Code in Pass 2 bekannt.
S1 B FWD ...FWD Equ * ...Bkwd Equ * ...S2 B Bkwd
Hochrangige Abgeordnete
Anspruchsvoller hochrangige Abgeordnete Bereitstellung von Sprachabstraktionen wie:
- Aufrufe und Aufrufe auf hoher Ebene
- Erweiterte Steuerungsstrukturen (wenn/dann/sonst, Schalter)
- Hochgefertigte abstrakte Datentypen, einschließlich Strukturen/Datensätze, Gewerkschaften, Klassen und Sets
- Ausgeschnittene Makroverarbeitung (obwohl seit den späten 1950er Jahren für normale Abgeordnete verfügbar für z. B. die IBM 700 Serie und IBM 7000 -Serieund seit den 1960er Jahren für IBM System/360 (S/360) unter anderen Maschinen)
- Objekt orientierte Programmierung Funktionen wie Klassen, Objekte, Abstraktion, Polymorphismus, und Nachlass[22]
Sehen Sprachdesign Im Folgenden für weitere Details.
Montagesprache
Ein in der Versammlungssprache geschriebenes Programm besteht aus einer Reihe von einer Reihe von mnemonisch Prozessoranweisungen und Meta-Statements (unterschiedlich als deklarative Operationen, Richtlinien, Pseudoinstruktionen, Pseudo-Operationen und Pseudooperationen), Kommentare und Daten. Anweisungen der Montagesprachanweisungen bestehen normalerweise aus einem Opcode mnemonisch gefolgt von einem Operand, die eine Liste von Daten, Argumenten oder Parametern sein könnten.[23] Einige Anweisungen können "impliziert" sein, was bedeutet, dass die Daten, auf denen die Anweisung betrieben wird, implizit durch die Anweisung selbst definiert wird - wie bei einer Anweisung wird kein Operand angelegt. Die resultierende Aussage wird durch eine übersetzt Assembler hinein Maschinensprache Anweisungen, die in den Speicher geladen und ausgeführt werden können.
Zum Beispiel enthält die folgende Anweisung eine x86/IA-32 Prozessor, um eine zu bewegen Sofortiger 8-Bit-Wert in ein registrieren. Das Binärcode Für diese Anweisung ist 10110 gefolgt von einer 3-Bit-Kennung, für die Register verwendet werden soll. Die Kennung für die Al Das Register ist 000, also Folgendes Maschinensprache lädt die Al Registrieren Sie sich bei den Daten 01100001.[23]
10110000 01100001
Dieser binäre Computercode kann durch Ausdrücken in menschlicher Lesbarer gestaltet werden hexadezimal folgendermaßen.
B0 61
Hier, B0
bedeutet 'Verschieben Sie eine Kopie des folgenden Wertes in Al, und 61
ist eine hexadezimale Darstellung des Wertes 01100001, der 97 in beträgt Dezimal. Montagesprache für die 8086 -Familie liefert die mnemonisch MOV (eine Abkürzung von Bewegung) Für Anweisungen wie diese kann der obige Maschinencode wie folgt wie folgt geschrieben werden, was nach dem Semikolon bei Bedarf mit einem erklärenden Kommentar vollständig ist. Dies ist viel einfacher zu lesen und sich zu erinnern.
MOV Al, 61H ; Laden Sie Al mit 97 Dezimaler (61 Hex)
In einigen Montagesprachen (einschließlich dieses) kann dieselbe Mnemonik, wie z. B. MOV, für eine Familie verwandter Anweisungen zum Laden, Kopieren und Verschieben von Daten verwendet werden, unabhängig davon, ob dies unmittelbare Werte, Werte in Registern oder Speicherorte sind Werte in Registern oder durch unmittelbare (a.k.a direkte) Adressen. Andere Assembler können separate Opcode -Mnemonik wie L verwenden, um "Speicher zu registrieren", ST für "Register für Speicher", LR für "Register zu registrieren", MVI für "Sofortiger Operand in den Speicher" usw.
Wenn dieselbe Mnemonik für verschiedene Anweisungen verwendet wird, bedeutet dies, dass die Mnemonik verschiedenen Binäranweisungscodes entspricht, ausgenommen Daten (z. B. die 61H
in diesem Beispiel) je nach Operanden, die dem Mnemonik folgen. Zum Beispiel für die X86/IA-32-CPUs die Intel-Assembler-Syntax Beweglich, ah
repräsentiert eine Anweisung, die den Inhalt des Registers bewegt AH in Register Al. Das[NB 4] Die hexadezimale Form dieser Anweisung lautet:
88 E0
Das erste Byte, 88H, identifiziert einen Wechsel zwischen einem Byte-Größe-Register und einem anderen Register oder Speicher, und das zweite Byte E0H wird codiert (mit drei Bitfeldern), um festzustellen, dass beide Operanden Register sind, die Quelle ist AHund das Ziel ist Al.
In einem Fall wie diesem, in dem dieselbe Mnemonik mehr als einen binären Anweisungen darstellen kann, bestimmt der Assembler, welche Anweisungen durch Untersuchung der Operanden erzeugt werden sollen. Im ersten Beispiel der Operand 61H
ist eine gültige hexadezimale numerische Konstante und kein gültiger Registername, also nur die B0
Anweisungen können anwendbar sein. Im zweiten Beispiel der Operand AH
ist ein gültiger Registername und keine gültige numerische Konstante (hexadezimal, dezimal, oktal oder binär), also nur die 88
Anweisungen können anwendbar sein.
Montagesprachen sind immer so konzipiert, dass diese Art von Eindeutigkeit durch ihre Syntax universell erzwungen wird. Zum Beispiel muss in der Intel X86 -Assemblersprache eine hexadezimale Konstante mit einer Zifferstelligkeit beginnen 0AH
oder 0AH
, nicht AH
speziell, damit es nicht der Name des Registers zu sein scheint AH. (Die gleiche Regel verhindert auch Unklarheiten mit den Namen von Registern BH, CH, und Dhsowie mit jedem benutzerdefinierten Symbol, das mit dem Buchstaben endet H und enthält ansonsten nur Charaktere, die hexadezimale Ziffern wie das Wort "Strand" sind.)
Rückkehr zum ursprünglichen Beispiel, während der x86 Opcode 10110000 (B0
) kopiert einen 8-Bit-Wert in die Al Register, 10110001 (B1
) bewegt es in Cl und 10110010 (B2
) tut dies in Dl. Beispiele für Versammlungssprachen für diese folgen.[23]
MOV Al, 1H ; Last AL mit unmittelbarem Wert 1 MOV Cl, 2H ; Laden Sie CL mit unmittelbarem Wert 2 MOV Dl, 3h ; Last DL mit unmittelbarem Wert 3
Die Syntax von MOV kann auch komplexer sein, wie die folgenden Beispiele zeigen.[24]
MOV Eax, [Ebx] ; Bewegen Sie die 4 Bytes im Speicher an der in EBX enthaltenen Adresse in EAX MOV [Esi+Eax], Cl ; Bewegen Sie den Inhalt von CL in das Byte an der Adresse ESI+EAX MOV Ds, Dx ; Bewegen Sie den Inhalt von DX in Segmentregister DS
In jedem Fall wird die movemonische Mnemonik direkt in einen der Opcodes 88-8C, 8E, A0-A3, B0-BF, C6 oder C7 durch einen Assembler übersetzt, und der Programmierer muss normalerweise nicht wissen oder sich daran erinnern, welche.[23]
Das Umwandeln der Montagesprache in den Maschinencode ist die Aufgabe eines Assemblers, und das Gegenteil kann zumindest teilweise durch a erreicht werden Disassembler. nicht wie hochrangige Sprachen, da ist ein Eins-zu-eins-Korrespondenz Zwischen vielen einfachen Montageanweisungen und Anweisungen für Maschinensprachen. In einigen Fällen kann ein Assembler jedoch bereitgestellt werden Pseudoinstruktionen (im Wesentlichen Makros), die sich in mehrere Anweisungen für maschinelle Sprache ausdehnen, um häufig erforderliche Funktionen zu liefern. Beispielsweise kann ein Assembler für eine Maschine, deren Anweisung "Zweig" fehlt, eine Pseudoinstruktion liefert, die sich auf den "Set If Less" und "Zweig, wenn Null) ausdehnt (auf das Ergebnis der festgelegten Anweisung)" der Maschine). " . Die meisten Abbauler mit Vollgeeignungen bieten auch eine reichhaltige Makro Sprache (unten diskutiert), die von Anbietern und Programmierern verwendet wird, um komplexere Code- und Datensequenzen zu generieren. Da die in der Assembler-Umgebung definierten Pseudoinstruktionen und Makros im Objektprogramm nicht vorhanden sind, kann ein Disassembler die Makro- und Pseudoinstrukturaufrufe nicht rekonstruieren, aber nur die tatsächlichen Maschinenanweisungen, die der Assembler aus diesen abstrakten Montage-Sprachen erzeugt, zerlegen. Da der Assembler die Kommentare in der Montage -Sprach -Quelldatei ignoriert und keinen Einfluss auf den von ihm generierten Objektcode haben, kann ein Disassembler immer die Quellkommentare vollständig wiederherstellen.
Jeder Rechnerarchitektur hat eine eigene Maschinensprache. Computer unterscheiden sich in der Anzahl und Art der Operationen, die sie unterstützen, in den verschiedenen Größen und Anzahl der Register sowie in den Darstellungen von Daten im Speicher. Während die meisten allgemeinen Computer in der Lage sind, im Wesentlichen dieselbe Funktionalität durchzuführen, unterscheiden sich die Art und Weise, wie sie dies tun. Die entsprechenden Assemblersprachen spiegeln diese Unterschiede wider.
Mehrere Sätze von Mnemonik oder für einen einzelnen Befehlssatz, der in verschiedenen Assembler-Programmen typischerweise so instanziiert ist, dass sie in verschiedenen Assembler-Programmen so instanziiert sind, dass eine montagesprachige Syntax vorliegt. In diesen Fällen ist das beliebteste in der Regel der vom CPU -Hersteller gelieferte und in seiner Dokumentation verwendet.
Zwei Beispiele für CPUs mit zwei verschiedenen Mnemonik -Sätzen sind die Intel 8080 -Familie und die Intel 8086/8088. Da Intel ein Urheberrecht über seine Versammlungssprachenmnemonik (auf jeder Seite ihrer Dokumentation, die zumindest in den 1970er und frühen 1980er Jahren veröffentlicht wurde) behauptete, haben einige Unternehmen, die CPUs, die mit Intel -Anweisungssätzen kompatibel waren, ihre eigenen Mnemonik erfunden. Das Zilog Z80 CPU, eine Verbesserung der Intel 8080aunterstützt alle 8080A -Anweisungen und viele weitere; Zilog erfand eine völlig neue Versammlungssprache, nicht nur für die neuen Anweisungen, sondern auch für alle 8080A -Anweisungen. Zum Beispiel, wo Intel die Mnemonik verwendet MOV, MVI, LDA, Sta, Lxi, Ldax, Stax, Lhld, und Slld Für verschiedene Anweisungen zur Datenübertragung verwendet die Z80 -Assemblersprache die Mnemonik Ld für alle. Ein ähnlicher Fall ist der NEC V20 und V30 CPUs, verbesserte Kopien des Intel 8086 bzw. 8088. Wie Zilog mit dem Z80 erfand NEC neue Mnemonics für alle Anweisungen von 8086 und 8088, um Vorwürfe wegen Verstoßes gegen das Urheberrecht von Intel zu vermeiden. (Es ist fraglich, ob solche Urheberrechte gültig sein können, und später CPU -Unternehmen wie z. AMD[NB 5] und Cyrix Neu veröffentlichte Intels x86/IA-32-Anweisung Mnemonics genau mit weder Genehmigung noch rechtliche Strafe.) Es ist zweifelhaft, ob in der Praxis viele Menschen, die den V20 und V30 programmiert haben, tatsächlich in NECs Versammlungssprache anstelle von Intel geschrieben; Da zwei beliebige Assemblersprachen für dieselbe Anweisungsarchitektur isomorph sind (etwas wie Englisch und Schwein lateinisch) Es ist nicht erforderlich, die veröffentlichte Montagesprache eines Herstellers mit den Produkten eines Herstellers zu verwenden.
Sprachdesign
Grundelemente
Es gibt ein großes Maß an Vielfalt in der Art und Weise, wie die Autoren von Assembern Aussagen kategorisieren und in der Nomenklatur, die sie verwenden. Insbesondere beschreiben einige etwas anderes als eine maschinelle mnemonische oder erweiterte Mnemonik als Pseudo-Operation (Pseudo-OP). Eine typische Assemblersprache besteht aus 3 Arten von Anweisungsanweisungen, mit denen Programmvorgänge definiert werden:
- Opcode Mnemonik
- Datennminorien
- Versammlungsrichtlinien
Opcode -Mnemonik und erweiterte Mnemonik
Anweisungen (Aussagen) in der Montagesprache sind im Allgemeinen sehr einfach, im Gegensatz zu denen in hochrangige Sprachen. Im Allgemeinen ist ein Mnemonik ein symbolischer Name für einen einzelnen ausführbaren Maschinensprachanweis (ein Opcode), und es gibt mindestens einen Opcode -Mnemonikum für jede Maschinensprachanweisung. Jede Anweisung besteht typischerweise aus einem Betrieb oder Opcode plus null oder mehr Operanden. Die meisten Anweisungen beziehen sich auf einen einzelnen Wert oder ein Wertepaar. Operanden können sofort (Wert in der Anweisung selbst codiert), Register in der Anweisung oder implizit oder die Adressen von Daten an anderer Stelle im Speicher. Dies wird durch die zugrunde liegende Prozessorarchitektur bestimmt: Der Assembler reflektiert lediglich, wie diese Architektur funktioniert. Erweiterte Mnemonik werden häufig verwendet, um eine Kombination aus einem Opcode mit einem bestimmten Operanden anzugeben, z. B. das System/360 -Assembler verwenden B
als ausgedehnte Mnemonikum für BC
mit einer Maske von 15 und NOP
("Keine Operation" - tun Sie für einen Schritt nichts) für BC
mit einer Maske von 0.
Erweiterte Mnemonik werden oft verwendet, um spezielle Verwendungen von Anweisungen zu unterstützen, häufig für Zwecke, die nicht aus dem Anweisungsnamen ersichtlich sind. Zum Beispiel haben viele CPUs keine explizite NOP -Anweisung, haben jedoch Anweisungen, die für diesen Zweck verwendet werden können. In 8086 CPUs die Anweisung xchg ax,ax
wird für nop
, mit nop
Ein Pseudo-Opcode zu sein, um die Anweisung zu codieren xchg ax,ax
. Einige Disassembler erkennen dies und werden die dekodieren xchg ax,ax
Anweisung als nop
. In ähnlicher Weise sind IBM -Assembler für System/360 und System/370 Verwenden Sie die erweiterten Mnemonik NOP
und NOPR
zum BC
und BCR
mit null Masken. Für die SPARC -Architektur sind diese als bezeichnet als synthetische Anweisungen.[25]
Einige Assembler unterstützen auch einfache integrierte Makroinstruktionen, die zwei oder mehr Maschinenanweisungen generieren. Zum Beispiel mit einigen Z80 -Assembern die Anweisung ld hl,bc
wird erkannt, um zu erzeugen ld l,c
gefolgt von ld h,b
.[26] Diese sind manchmal als bekannt als als Pseudo-Opcodes.
Mnemonik sind willkürliche Symbole; 1985 the IEEE Veröffentlichte Standard 694 für eine einheitliche Menge von Mnemonik, die von allen Abgängern verwendet werden sollen. Der Standard wurde seitdem zurückgezogen.
Datenanweisungen
Es gibt Anweisungen zum Definieren von Datenelementen zum Abhalten von Daten und Variablen. Sie definieren die Art der Daten, die Länge und die Ausrichtung von Dateien. Diese Anweisungen können auch definieren, ob die Daten externen Programmen (separat zusammengebaute Programme) oder nur für das Programm zur Verfügung stehen, in dem der Datenabschnitt definiert ist. Einige Abgeordnete klassifizieren diese als Pseudooperation.
Versammlungsrichtlinien
Assembly-Richtlinien, auch Pseudo-Opcodes, Pseudo-Operationen oder Pseudooperationen genannt, sind Befehle, die einem Assembler "Anweisungen zur Durchführung von Operationen als Montage-Anweisungen" zur Verfügung gestellt werden.[19] Richtlinien wirken sich auf die Funktionsweise des Assemblers aus und "können sich auf den Objektcode, die Symboltabelle, die Listungsdatei und die Werte der internen Assemblerparameter auswirken". Manchmal der Begriff Pseudo-Opcode ist für Anweisungen reserviert, die Objektcode generieren, z. B. solche, die Daten generieren.[27]
Die Namen von Pseudooperationen beginnen oft mit einem Punkt, um sie von Maschinenanweisungen zu unterscheiden. Pseudo-OPs können die Montage des Programms von den Parametern durch einen Programmierer abhängen, sodass ein Programm auf unterschiedliche Weise für verschiedene Anwendungen zusammengestellt werden kann. Oder mit einem Pseudo-op kann die Darstellung eines Programms manipulieren, um das Lesen und Aufrechterhalten des Programms zu erleichtern. Eine weitere häufige Verwendung von Pseudo-OPs besteht darin, Speicherbereiche für Laufzeitdaten zu reservieren und ihren Inhalt optional in bekannte Werte zu initialisieren.
Mit symbolischen Abgingen können Programmierer willkürliche Namen assoziieren (Etiketten oder Symbole) mit Gedächtnisorten und verschiedenen Konstanten. Normalerweise erhält jede Konstante und Variable einen Namen, sodass Anweisungen auf diese Positionen mit Namen verweisen können und somit fördern können Selbstdokumentationscode. In ausführbarer Code ist der Name jeder Unterroutine mit seinem Einstiegspunkt zugeordnet, sodass alle Anrufe an eine Unterprogramme seinen Namen verwenden können. Innen -Unterprogramme, GEHE ZU Ziele erhalten Etiketten. Einige Assembler unterstützen Lokale Symbole die sich oft lexikal von normalen Symbolen unterscheiden (z. B. die Verwendung von "10 $" als GOTO -Ziel).
Einige Abgeordnete, wie z. Nasm, bieten Sie ein flexibles Symbolmanagement und lassen Sie Programmierer unterschiedlich verwalten Namespacesberechnen automatisch Aussätze innerhalb Datenstrukturenund weisen Sie Beschriftungen zu, die sich auf wörtliche Werte oder das Ergebnis einfacher Berechnungen beziehen, die vom Assembler durchgeführt werden. Etiketten können auch zur Initialisierung von Konstanten und Variablen mit verlagbaren Adressen verwendet werden.
Assemblersprachen ermöglichen, wie die meisten anderen Computersprachen, Kommentare zum Programm hinzugefügt werden Quellcode Das wird während der Montage ignoriert. Quädiger Kommentare sind in den Programmen zur Sprachsprache von Versammlungen von wesentlicher Bedeutung, da die Bedeutung und der Zweck einer Abfolge von Binärmaschinenanweisungen schwer zu bestimmen sein können. Die "rohe" (unkontrollierte) Montagesprache, die von Compilern oder Disassembern erzeugt wird, ist ziemlich schwer zu lesen, wenn Änderungen vorgenommen werden müssen.
Makros
Viele Assembler unterstützen Vordefinierte Makrosund andere unterstützen Programmierer definiert (und wiederholt neu definierbar) Makros mit Sequenzen von Textlinien, in denen Variablen und Konstanten eingebettet sind. Die Makrodefinition ist am häufigsten[NB 6] Eine Mischung aus Assembler -Aussagen, z. B. Anweisungen, Anweisungen für symbolische Maschine und Vorlagen für Assembler -Anweisungen. Diese Abfolge von Textzeilen kann Opcodes oder Richtlinien enthalten. Sobald ein Makro definiert wurde, kann sein Name anstelle eines Mnemonikums verwendet werden. Wenn der Assembler eine solche Anweisung verarbeitet, ersetzt er die Anweisung durch die mit diesem Makro verknüpften Textzeilen und verarbeitet sie dann so, als ob sie in der Quellcode -Datei vorhanden sind (einschließlich in einigen Assembern, die im Ersatztext vorhandene Makros ausgeht). . Makros in diesem Sinne datieren Sie IBM Autokomer der 1950er Jahre.[28][NB 7]
Makroabläufe haben typischerweise Anweisungen, um Makros zu definieren, Variablen zu definieren, Variablen auf das Ergebnis eines arithmetischen, logischen oder String -Ausdrucks zu setzen, iterieren und conditionell Code zu generieren. Einige dieser Richtlinien können in einer Makrodefinition verwendet werden, z. B.. Mexit in Hlasm, während andere innerhalb des offenen Code (externe Makrodefinitionen) zulässig sein können, z. B.,, Aif und KOPIEREN In Hlasm.
In der Montagesprache stellt der Begriff "Makro" ein umfassenderes Konzept dar als in einigen anderen Kontexten wie der Präprozessor in dem C Programmiersprache, wo seine #Define -Anweisung normalerweise zum Erstellen von kurzen einzelnen Makros verwendet wird. Assembler -Makroanweisungen wie Makros in Pl/i und einige andere Sprachen können für sich selbst langwierige "Programme" sein, die durch Interpretation durch den Assembler während der Versammlung ausgeführt werden.
Da Makros "kurze" Namen haben können, aber auf mehrere oder in der Tat viele Codezeilen erweitern können, können sie verwendet werden, um die Programme von Montagesprachen weitaus kürzer zu machen, was weniger Zeilen von Quellcode erfordert, wie bei höheren Sprachen. Sie können auch verwendet werden, um den Montageprogrammen höhere Strukturebenen hinzuzufügen und optional eingebetteter Debugging -Code über Parameter und andere ähnliche Merkmale einzuführen.
Makroabläufer erlauben Makros häufig zu nehmen Parameter. Einige Assembler enthalten ziemlich ausgefeilte Makrosprachen, die solche Sprachelemente auf hoher Ebene wie optionale Parameter, symbolische Variablen, Bedingungen, String-Manipulation und arithmetische Operationen enthalten, die alle während der Ausführung eines bestimmten Makros verwendet werden können, und ermöglicht Makros, Kontext- oder Austauschinformationen zu sparen . Somit kann ein Makro basierend auf den Makroargumenten zahlreiche Anweisungen oder Datendefinitionen für Assembly -Sprache generieren. Dies kann verwendet werden, um Datenstrukturen im Datensatzstil zu generieren oder "abgerollt"Loops, zum Beispiel oder können ganze Algorithmen basierend auf komplexen Parametern generieren. Beispielsweise kann ein" Sortier "-Makro die Spezifikation eines komplexen Sorttaste akzeptieren und Code generieren, die für diesen spezifischen Schlüssel gefertigt wurden, ohne die Laufzeittests zu benötigen, die die Laufzeit-Taste benötigen, die dies benötigt, die dies benötigt wäre für ein allgemeines Verfahren erforderlich, das die Spezifikation interpretiert. Eine Organisation, die mit Montagesprachen verwendet wurde, die mit einer solchen Makrosuite stark erweitert wurde Konzeptionelle Elemente. Untersteilung dieses Punktes und Makros wurden verwendet, um eine frühzeitige Implementierung virtuelle Maschine in Snobol4 (1967), das in der Snobol -Implementierungssprache (SIL) geschrieben wurde, eine Assemblersprache für eine virtuelle Maschine. Die Zielmaschine würde dies mit a in seinen nativen Code übersetzen Makro -Assembler.[29] Dies ermöglichte ein hohes Maß an Portabilität für die Zeit.
Makros wurden verwendet, um große Softwaresysteme für bestimmte Kunden in der Mainframe -Ära anzupassen, und wurden auch vom Kundenpersonal verwendet, um die Bedürfnisse ihrer Arbeitgeber zu erfüllen, indem sie spezifische Versionen von Herstellungsbetriebssystemen erstellen. Dies wurde zum Beispiel von Systemprogrammierern durchgeführt, IBM's Conversational Monitor System / Virtual Machine (VM/CMS) und mit IBM-Add-Ons "Echtzeit-Transaktionsverarbeitung", Kundeninformationssteuerungssystem CICs, und ACP/TPF, das Flug-/Finanzsystem, das in den 1970er Jahren begann und immer noch viele große betreibt Computerreservierungssysteme (CRS) und Kreditkartensysteme heute.
Es ist auch möglich, ausschließlich die Makroverarbeitungsfähigkeiten eines Assemblers zu verwenden, um in völlig unterschiedlichen Sprachen Code zu generieren, um beispielsweise eine Version eines Programms in zu generieren Cobol Verwenden eines reinen Makro -Assembler -Programms mit Zeilen von COBOL -Code in den Montagezeitoperatoren, die den Assembler anweisen, beliebiger Code zu generieren. IBM OS/360 verwendet Makros, um durchzuführen Systemgenerierung. Der Benutzer gibt Optionen an, indem sie eine Reihe von Assembler -Makros codiert. Das Zusammenbau dieser Makros erzeugt a Job Stream das System bauen, einschließlich Arbeitskontrollsprache und Dienstprogramm Kontrollanweisungen.
Dies liegt daran, dass das Konzept der "Makroverarbeitung", wie in den 1960er Jahren realisiert wurde, unabhängig vom Konzept der "Assemblierung" ist, wobei das erstere moderne Begriffe mehr Textverarbeitung, Textverarbeitung und Generierung von Objektcode ist. Das Konzept der Makroverarbeitung erschien und erscheint in der C -Programmiersprache, die "Präprozessoranweisungen" zum Festlegen von Variablen und zur Durchführung von Bedingungstests zu ihren Werten unterstützt. Im Gegensatz zu bestimmten früheren Makroprozessoren in Assembler ist der C -Präprozessor nicht Turing-Complete Weil es die Fähigkeit fehlt, entweder zu schleifen oder zu "zu" zu gehen, ermöglicht es den Programmen zum Schleifen.
Trotz der Kraft der Makroverarbeitung fiel es in vielen Sprachen auf hoher Ebene nicht aus (wesentliche Ausnahmen waren C, C ++ und pl/i) während der Versammler eine Staude bleibt.
Die Substitution des Makroparameters erfolgt ausschließlich mit Namen: Zur Makroverarbeitungszeit wird der Wert eines Parameters durch seinen Namen textuell ersetzt. Die berühmteste Klasse von Fehler, die sich ergibt, war die Verwendung eines Parameters, der selbst ein Ausdruck und kein einfacher Name war, wenn der Makroautor einen Namen erwartete. Im Makro:
Foo: Makro A Last a*b
Die Absicht war, dass der Anrufer den Namen einer Variablen angeben würde und die "globale" Variable oder Konstante B verwendet wird, um "A" zu multiplizieren. Wenn Foo mit dem Parameter aufgerufen wird a-c
, die Makroerweiterung von laden a-c*b
tritt ein. Um mögliche Mehrdeutigkeiten zu vermeiden, können Benutzer von Makroprozessoren formale Parameter in Makrodefinitionen oder Anrufer die Eingabeparameter aufnehmen.[30]
Unterstützung für die strukturierte Programmierung
Pakete mit Makros wurden geschrieben, die bereitgestellt wurden Strukturierte Programmierung Elemente zur codierenden Ausführungsfluss. Das früheste Beispiel für diesen Ansatz war das Konzept-14-Makro-Set,[31] ursprünglich vorgeschlagen von Harlan Mills (März 1970) und von Marvin Kessler in der Federal Systems Division IBM implementiert, die if/else/endif und ähnliche Steuerungsströmungsblöcke für OS/360 -Assembler -Programme bereitstellten. Dies war eine Möglichkeit, die Verwendung von zu reduzieren oder zu beseitigen GEHE ZU Operationen im Montagecode, einer der Hauptfaktoren, die verursacht werden Spaghetti -Code in der Montagesprache. Dieser Ansatz wurde in den frühen 1980er Jahren weithin akzeptiert (die letzten Tage des groß angelegten Versammlungssprachgebrauchs). IBMs High -Level -Assembler -Toolkit von IBM[32] Enthält ein solches Makropaket.
Ein merkwürdiges Design war a-natural, ein "streamorientierter" Assembler für 8080/Z80, Prozessoren von Whitesmiths Ltd. (Entwickler der Unix-wie Idris Betriebssystem und was als erste Werbespot berichtet wurde C Compiler). Die Sprache wurde als Assembler eingestuft, weil sie mit Rohmaschinenelementen wie funktioniert hat Opcodes, Register, und Gedächtnisreferenzen; Es umfasste jedoch eine Expressionssyntax, um die Ausführungsreihenfolge anzuzeigen. Klammern und andere spezielle Symbole sowie blockorientierte strukturierte Programmierkonstrukte kontrollierten die Sequenz der generierten Anweisungen. A-natural wurde eher als Objektsprache eines C-Compilers als zum Handcodieren aufgebaut, aber seine logische Syntax gewann einige Fans.
Seit dem Rückgang der groß angelegten Versammlungssprachenentwicklung gab es wenig offensichtliche Nachfrage nach anspruchsvolleren Absammlern.[33] Trotzdem werden sie immer noch in Fällen entwickelt und angewendet, in denen Ressourcenbeschränkungen oder Besonderheiten in der Architektur des Zielsystems die effektive Verwendung höherer Sprachen verhindern.[34]
Assembler mit einer starken Makro -Engine ermöglichen eine strukturierte Programmierung über Makros, wie das Switch -Makro mit dem Masm32 -Paket (dieser Code ist ein vollständiges Programm):
enthalten \Masm32\enthalten\masm32rt.inc ; Verwenden Sie die Masm32 -Bibliothek .Code Demomain: WIEDERHOLEN 20 Schalter RV(Nrandom, 9) ; Generieren Sie eine Zahl zwischen 0 und 8 MOV ECX, 7 Fall 0 drucken "Fall 0" Fall ECX ; Im Gegensatz zu den meisten anderen Programmiersprachen,, drucken "Fall 7" ; Der Masm32 -Switch ermöglicht "variable Fälle" Fall 1 .. 3 .wenn eax==1 drucken "Fall 1" .elseif eax==2 drucken "Fall 2" .anders drucken "Fälle 1 bis 3: Andere" .endif Fall 4, 6, 8 drucken "Fälle 4, 6 oder 8" Ursprünglich MOV ebx, 19 ; 20 Sterne drucken .Wiederholen drucken "*" dez ebx .Bis um Sign? ; Schleife, bis das Zeichenflag eingestellt ist Endsw drucken CHr $(13, 10) Endm Ausfahrt Ende Demomain
Verwendung der Versammlungssprache
Historische Perspektive
Montagesprachen waren zum Zeitpunkt der Zeit nicht verfügbar, als die Computerprotokollcomputer wurde vorgestellt. Kathleen Booth "wird der Erfindung der Versammlungssprache gutgeschrieben"[35][36] Basierend auf theoretischen Arbeiten begann sie 1947, während sie an der Arbeit arbeitete ARC2 bei Birkbeck, Universität von London Nach Konsultation von Andrew Booth (später ihr Ehemann) mit Mathematiker John von Neumann und Physiker Herman Goldstine Bei der Institut für fortgeschrittenes Studium.[36][37]
Ende 1948 die Automatischer Taschenrechner für elektronische Verzögerungsspeicher (EDSAC) ließ einen Assembler (mit dem Namen "Anfangsordnungen") in seine integriert Bootstrap Programm. Es verwendete ein Buchstaben-Mnemonik, die von entwickelt wurden von David Wheeler, der von der IEEE Computer Society als Schöpfer des ersten "Assemblers" gutgeschrieben wird.[19][38][39] Berichte über den EDSAC führten den Begriff "Montage" ein, um Felder in ein Anweisungswort zu kombinieren.[40] SEIFE (Symbolisches optimales Montageprogramm) war eine Versammlungssprache für die IBM 650 Computer von Stan Poley 1955 geschrieben.[41]
Montagesprachen beseitigen einen Großteil des fehleranfälligen, mühsamen und zeitaufwändigen erste Generation Die Programmierung benötigt mit den frühesten Computern, die Programmierer aus der Langeweile befreien, z. B. das Erinnern numerischer Codes und Berechnung von Adressen. Sie wurden einst für alle möglichen Programmierungen verwendet. In den späten 1950er Jahren war ihre Verwendung jedoch weitgehend durch Sprachen auf höherer Ebene auf der Suche nach verbesserten Sprachen ersetzt worden Programmierungsproduktivität. Heutzutage wird die Assemblersprache weiterhin für die Manipulation der direkten Hardware, für den Zugriff auf spezielle Prozessoranweisungen oder für kritische Leistungsprobleme verwendet.[42] Typische Verwendungen sind Gerätetreiber, niedrig eingebettete Systeme, und Echtzeit Systeme (siehe § Aktuelle Verwendung).
In der Vergangenheit wurden zahlreiche Programme vollständig in der Versammlungssprache geschrieben. Das Burroughs MCP (1961) war der erste Computer, für den ein Betriebssystem nicht vollständig in der Montagesprache entwickelt wurde. es wurde geschrieben in Problemorientierte Sprache von Führungssystemen (ESPOL), ein Algol -Dialekt. Viele kommerzielle Anwendungen wurden auch in der Montagesprache geschrieben, einschließlich einer großen Menge der IBM Mainframe Software, die von großen Unternehmen geschrieben wurde. Cobol, Forran und einige PL/I haben schließlich einen Großteil dieser Arbeiten verdrängt, obwohl eine Reihe großer Organisationen in den neunziger Jahren die Anwendungsinfrastrukturen für montagesprachige Anwendung behielten.
Die meisten frühen Mikrocomputer stützten sich auf handcodierte Montagesprache, einschließlich der meisten Betriebssysteme und großen Anwendungen. Dies lag daran, dass diese Systeme schwerwiegende Ressourcenbeschränkungen aufwiesen, ein eigenständiges Gedächtnis erhoben und Architekturen angezeigt und begrenzte, fehlerhafte Systemdienste erbrachten. Vielleicht wichtiger war der Mangel an erstklassigen hochrangigen Sprachkompilern, die für die Verwendung von Mikrocomputern geeignet sind. Ein psychologischer Faktor könnte auch eine Rolle gespielt haben: Die erste Generation von Mikrocomputer -Programmierern behielt einen Hobbyisten "Kabel und Zange".
In einem kommerzielleren Kontext waren die größten Gründe für die Verwendung der Montagesprache minimales Aufblähen (Größe), minimaler Overhead, größerer Geschwindigkeit und Zuverlässigkeit.
Typische Beispiele für große Assembler -Sprachprogramme aus dieser Zeit sind IBM PC DOS Betriebssysteme, die Turbo Pascal Compiler und frühe Anwendungen wie die Kalkulationstabelle Programm Lotus 1-2-3. Die Montagesprache wurde verwendet, um die beste Leistung aus der Sega Saturn, eine Konsole, die notorisch schwierig war, Spiele zu entwickeln und zu programmieren.[43] Das Arcade -Spiel von 1993 NBA Jam ist ein weiteres Beispiel.
Die Versammlungssprache ist seit langem die primäre Entwicklungssprache für viele beliebte Heimcomputer der 1980er und 1990er Jahre (wie die MSX, Sinclair ZX -Spektrum, Commodore 64, Commodore Amiga, und Atari st). Dies war größtenteils weil interpretiert Grundlegende Dialekte für diese Systeme boten eine unzureichende Ausführungsgeschwindigkeit sowie unzureichende Einrichtungen, um die verfügbare Hardware auf diesen Systemen voll auszunutzen. Einige Systeme haben sogar eine integrierte Entwicklungsumgebung (IDE) mit hoch fortgeschrittenen Debugging- und Makroanlagen. Einige Compiler für die verfügbaren Funkraum TRS-80 und seine Nachfolger hatten die Fähigkeit, die Inline-Montagequelle mit hochrangigen Programmaussagen zu kombinieren. Bei der Zusammenstellung erzeugte ein eingebauter Assembler Inline-Maschinencode.
Aktuelle Verwendung
Da hat es immer[44] Wurden Debatten über die Nützlichkeit und Leistung der Versammlungssprache im Vergleich zu Sprachen auf hoher Ebene.
Obwohl die Assemblersprache spezifische Nischen verwendet, die sie wichtig sind (siehe unten), gibt es andere Tools für die Optimierung.[45]
Ab Juli 2017[aktualisieren], das TIOBE index Die Popularität der Programmiersprache erhält die Versammlungssprache bei 11, voran, vor Visual Basic, zum Beispiel.[46] Assembler kann verwendet werden, um Geschwindigkeit zu optimieren oder für die Größe zu optimieren. Im Falle der Geschwindigkeitsoptimierung modern Compiler optimieren werden beansprucht[47] Um hochrangige Sprachen in Code zu verwandeln, die trotz der Gegenbeispiele, die gefunden werden können, so schnell wie handgeschriebene Montage ausgeführt werden können.[48][49][50] Die Komplexität moderner Prozessoren und Speicher-Subsysteme wird für Compiler sowie für Montageprogrammierer zunehmend erschwert.[51][52] Darüber hinaus hat die Erhöhung der Prozessorleistung dazu geführt, dass die meisten CPUs die meiste Zeit im Leerlauf sitzen.[53] mit Verzögerungen, die durch vorhersehbare Engpässe wie Cache -Misses verursacht werden, I/o Operationen und Paging. Dies hat für viele Programmierer eine RAW-Code-Ausführungsgeschwindigkeit zu einer Nicht-Ausgabe gemacht.
Es gibt einige Situationen, in denen Entwickler die Montagesprache verwenden könnten:
- Schreiben von Code für Systeme mit ältere Prozessoren[Klarstellung erforderlich] die begrenzte hochrangige Sprachoptionen wie die haben Atari 2600, Commodore 64, und Grafikrechner.[54] Programme für diese Computer der 1970er und 1980er Jahre werden häufig im Kontext von geschrieben Demoscene oder Retrogaming Subkulturen.
- Code, der beispielsweise direkt mit der Hardware interagieren muss Gerätetreiber und Interrupt Handler.
- In einem eingebetteten Prozessor oder DSP erfordern hohe Repetitionstörungen die kürzeste Anzahl von Zyklen pro Interrupt, z. B. einen Interrupt, der 1000 oder 10000-mal pro Sekunde auftritt.
- Programme, die prozessorspezifische Anweisungen verwenden müssen, die nicht in einem Compiler implementiert sind. Ein häufiges Beispiel ist das Bitweise Rotation Anweisungen im Kern vieler Verschlüsselungsalgorithmen sowie Abfragen der Parität eines Byte oder des 4-Bit-Trages einer Addition.
- Eine eigenständige ausführbare Datei kompakte Größe ist erforderlich, die ohne Rückgriff auf die ausgeführt werden muss Laufzeit Komponenten oder Bibliotheken mit einer hochrangigen Sprache verbunden. Zu den Beispielen gehörten Firmware für Telefone, Kraftstoff- und Zündsysteme für Automobile, Steuerungssysteme, Sicherheitssysteme und Sensoren.
- Programme mit leistungsempfindlichen inneren Schleifen, bei denen die Montagesprache Optimierungsmöglichkeiten bietet, die in einer Sprache auf hoher Ebene schwer zu erreichen sind. Zum Beispiel, Lineare Algebra mit Blas[48][55] oder Diskrete Cosinus -Transformation (z.B. Simd Assembly -Version von x264[56]).
- Programme, die vektorisierte Funktionen für Programme in höheren Sprachen wie C erstellen Intrinsische Funktionen Welche Karte direkt an Simd Mnemonics zugeordnet ist, aber dennoch zu einer Eins-zu-Eins-Konvertierung für den angegebenen Vektorprozessor führt.
- Echtzeit Programme wie Simulationen, Flugnavigationssysteme und medizinische Geräte. Zum Beispiel in a Fly-by-Wire System, Telemetrie muss innerhalb strenger Zeitbeschränkungen interpretiert und bearbeitet werden. Solche Systeme müssen Quellen unvorhersehbarer Verzögerungen beseitigen, die durch (einige) interpretierte Sprachen automatisch erstellt werden können Müllsammlung, Paging -Operationen oder Präventiver Multitasking. Einige Sprachen auf höherer Ebene enthalten jedoch Laufzeitkomponenten und Betriebssystemschnittstellen, die solche Verzögerungen einführen können. Versammlung wählen oder Sprach der unteren Ebene Für solche Systeme bietet Programmierern eine größere Sichtbarkeit und Kontrolle über Verarbeitungsdetails.
- Kryptografische Algorithmen, die immer genau zur gleichen Zeit dauern müssen, um auszuführen, und verhindern Timing -Angriffe.
- Ändern und erweitern Sie den für IBM Mainframe -Computer geschriebenen Legacy -Code.[57][58]
- Situationen, in denen die vollständige Kontrolle über die Umwelt erforderlich ist, in extrem hohen Sicherheit Situationen, in denen Nichts kann als selbstverständlich angesehen werden.
- Computer Virus, Bootloader, sicher Gerätetreiber, oder andere Elemente sehr nahe an der Hardware oder dem Betriebssystem mit niedrigem Niveau.
- Anweisungssatz Simulatoren Zur Überwachung, Verfolgung und Debuggen wo zusätzlicher Gemeinkosten auf ein Minimum gehalten werden.
- Situationen, in denen keine hochrangige Sprache vorhanden ist, auf einem neuen oder spezialisierten Prozessor, für den nein Cross Compiler ist verfügbar.
- Reverse-Engineering und Ändern von Programmdateien wie:
- vorhandenen Binärdateien Dies kann ursprünglich in einer hochrangigen Sprache geschrieben oder auch nicht, beispielsweise beim Versuch, Programme wiederherzustellen, für die der Quellcode nicht verfügbar ist oder verloren gegangen ist, oder den Kopierschutz der proprietären Software zu knacken.
- Videospiele (auch bezeichnet ROM Hacking), was über verschiedene Methoden möglich ist. Die am weitesten verbreitete Methode ist die Änderung des Programmcode auf der Versammlungsstufe.
Montagesprache wird in den meisten immer noch unterrichtet Informatik und elektronisches Ingenieurwesen Programme. Obwohl heute nur wenige Programmierer regelmäßig mit der Montagesprache als Werkzeug arbeiten, bleiben die zugrunde liegenden Konzepte wichtig. Fundamentale Themen wie Binärarithmetik, Speicherzuweisung, Stapelverarbeitung, Zeichensatz Codierung, unterbrechen Verarbeitung und Compiler Das Design wäre schwer ausführlich zu studieren, ohne dass ein Computer auf Hardwareebene funktioniert. Da das Verhalten eines Computers durch seinen Anweisungssatz grundlegend definiert ist, besteht die logische Möglichkeit, solche Konzepte zu lernen, eine Assemblersprache. Die meisten modernen Computer haben ähnliche Anweisungssätze. Daher reicht das Studium einer einzelnen Versammlungssprache aus, um zu lernen: i) die grundlegenden Konzepte; Ii) Situationen zu erkennen, in denen die Verwendung von Montagesprache angemessen sein kann; und iii) zu sehen, wie effizient ausführbarer Code aus hochrangigen Sprachen erstellt werden kann.[22]
Typische Anwendungen
- Die Montagesprache wird normalerweise in einem System verwendet Stiefel Code, der Code mit niedriger Ebene, der die Systemhardware vor dem Booten des Betriebssystems initialisiert und testet und häufig in gespeichert wird Rom. (BIOS auf IBM-kompatibel PC Systeme und CP/m ist ein Beispiel.)
- Die Montagesprache wird häufig für Code mit niedrigem Niveau verwendet Betriebssystemkerne, die sich nicht auf die Verfügbarkeit bereits bestehender Systemanrufe verlassen und sie tatsächlich für die jeweilige Prozessorarchitektur implementieren müssen, auf der das System ausgeführt wird.
- Einige Compiler übersetzen hochrangige Sprachen zuerst vor dem vollständigen Kompilieren in die Montage Debuggen und Optimierungszwecke.
- Einige Compiler für relativ niedrige Sprachen, wie z. Pascal oder CErmöglichen Sie dem Programmierer, die Montagesprache direkt in den Quellcode einzubetten (so genannt Inline -Baugruppe). Programme, die solche Einrichtungen verwenden, können dann Abstraktionen mit unterschiedlicher Montagesprache auf jeder Hardwareplattform konstruieren. Das System tragbar Code kann diese prozessorspezifischen Komponenten dann über eine einheitliche Schnittstelle verwenden.
- Montagesprache ist nützlich in Reverse Engineering. Viele Programme werden nur in Maschinencodeform verteilt, was unkompliziert ist, um durch a in die Montagesprache zu übersetzen Disassembler, aber schwieriger zu übersetzen in eine höhere Sprache durch a Dekompiler. Werkzeuge wie die Interaktiver Disassembler Nutzen Sie die Demontage für einen solchen Zweck ausführlich. Diese Technik wird von Hackern verwendet, um kommerzielle Software zu knacken, und Wettbewerber, um Software mit ähnlichen Ergebnissen von konkurrierenden Unternehmen zu produzieren.
- Die Montagesprache wird verwendet, um die Ausführungsgeschwindigkeit zu verbessern, insbesondere in frühen PCs mit begrenzter Verarbeitungsleistung und RAM.
- Assembler können verwendet werden, um Datenblöcke zu generieren, ohne dass der Sprachaufwand auf hohem Niveau von formatiertem und kommentiertem Quellcode von anderen Code verwendet werden kann.[59][60]
Siehe auch
- Compiler
- Vergleich von Abgeordneten
- Disassembler
- Hexadezimal
- Anweisungsset Architektur
- Kleiner Mann Computer -Ein Bildungscomputermodell mit einer Basis-10-Montagesprache
- Knabbern
- Typisierte Versammlungssprache
Anmerkungen
- ^ Anders als Meta-Assembler
- ^ Dies bedeutet jedoch nicht, dass die Assembler -Programme, die diese Sprachen implementieren, universell sind.
- ^ "Als Meta-Assembler wird der Benutzer seine eigenen Programmiersprachen entwerfen und Prozessoren für solche Sprachen mit mindestens Aufwand generieren."
- ^ Dies ist eine von zwei redundanten Formen dieser Anweisung, die identisch funktionieren. Der 8086 und mehrere andere CPUs aus den späten 1970er/frühen 1980er Jahren haben Redundanzen in ihren Anweisungssätzen, da es für Ingenieure einfacher war, diese CPUs (um sie auf Siliziumchips mit begrenzten Größen zu passen) mit den redundanten Codes zu entwerfen, als sie zu beseitigen (siehe Keine Begriffe). Jeder Assembler erzeugt normalerweise nur eine von zwei oder mehr redundanten Anweisungscodierungen, aber a Disassembler wird normalerweise einen von ihnen erkennen.
- ^ AMD Hersteller Zweiter Intel 8086, 8088 und 80286 CPUs sowie möglicherweise 8080A und/oder 8085A CPUs unter Lizenz von Intel Vertragsverletzung-und AMD entworfen, hergestellt und verkaufte 32-Bit- und 64-Bit-X86-Familien-CPUs ohne Intel-Hilfe oder Bestätigung.
- ^ In 7070 AutoCoder ist eine Makrodefinition ein 7070 -Makrogeneratorprogramm, das der Assembler aufruft. Autocoder bietet spezielle Makros für die Verwendung von Makrogeneratoren.
- ^ "Die folgende geringfügige Einschränkung oder Einschränkung ist in Bezug auf die Verwendung von 1401 Autokoder bei der Codierung von Makroanweisungen in Kraft ..."
Verweise
- ^ a b "Assemblersprache". High Level Assembler für Z/OS & Z/VM & Z/VSE Language Reference Version 1 Release 6. IBM. 2014 [1990]. SC26-4940-06.
- ^ "Assembly: Review" (PDF). Informatik und Ingenieurwesen. Hochschule für Ingenieure, Ohio State Universität. 2016. Archiviert (PDF) vom Original am 2020-03-24. Abgerufen 2020-03-24.
- ^ Archer, Benjamin (November 2016). Versammlungssprache für Schüler. North Charleston, South Carolina, USA: CreateSpace Independent Publishing. ISBN 978-1-5403-7071-6.
Die Montagesprache kann auch als symbolischer Maschinencode bezeichnet werden.
- ^ Streib, James T. (2020). "Leitfaden zur Montagesprache". Bachelorthemen in der Informatik. Cham: Springer International Publishing. doi:10.1007/978-3-030-35639-2. ISBN 978-3-030-35638-5. ISSN 1863-7310. S2CID 195930813.
Die Programmierung in der Montagesprache hat die gleichen Vorteile wie die Programmierung in der Maschinensprache, außer dass sie einfacher ist.
- ^ Saxon, James A.; Plette, William S. (1962). Programmieren des IBM 1401, eines selbstanbetrieblichen programmierten Handbuchs. Englewood Cliffs, New Jersey, USA: Prentice-Hall. Lccn 62-20615. (NB. Verwendung des Begriffs Montageprogramm.))
- ^ Kornelis, A. F. (2010) [2003]. "High Level Assembler - Opcodes -Übersicht, Assembler -Richtlinien". Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24.
- ^ "Makroanweisungen". High Level Assembler für Z/OS & Z/VM & Z/VSE Language Reference Version 1 Release 6. IBM. 2014 [1990]. SC26-4940-06.
- ^ Wilkes, Maurice Vincent; Wheeler, David John; Gill, Stanley J. (1951). Die Vorbereitung von Programmen für einen elektronischen digitalen Computer (Nachdruck 1982 ed.). Tomash Publishers. ISBN 978-0-93822803-5. OCLC 313593586.
- ^ Fairhead, Harry (2017-11-16). "Geschichte der Computersprachen - Das klassische Jahrzehnt, 1950er Jahre". Ich Programmierer. Archiviert vom Original am 2020-01-02. Abgerufen 2020-03-06.
- ^ "Wie hängen Montagesprachen von Betriebssystemen ab?". Stapelaustausch. Stack Exchange Inc. 2011-07-28. Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24. (NB. Systemaufrufe variieren oft, z. B. für MVS vs. VSE gegen VM/CMS; Die binären/ausführbaren Formate für verschiedene Betriebssysteme können ebenfalls variieren.)
- ^ Austerlitz, Howard (2003). "Computerprogrammiersprachen". Datenerfassungstechniken mit PCs. Elsevier. S. 326–360. doi:10.1016/b978-012068377-2/50013-9. ISBN 9780120683772.
Die Montagesprache (oder Assembler) ist eine kompilierte Computersprache mit niedriger Ebene. Es ist prozessorabhängig, da es im Grunde die Mnemonik des Assemblers direkt in die Befehle übersetzt, die eine bestimmte CPU eins zu eins versteht. Diese Assembler -Mnemonik sind der Anweisungssatz für diesen Prozessor.
- ^ Carnes, Beau (2022-04-27). "Programmieren von Assemblersprache mit Arm". freecodecamp.org. Abgerufen 2022-06-21.
Die Montagesprache ist häufig für eine bestimmte Computerarchitektur spezifisch, sodass mehrere Arten von Montagesprachen vorhanden sind. Arm ist eine immer beliebtere Montagesprache.
- ^ Brooks, Frederick P. (1986). "Keine Silberkugel -, es danach und Unfall in der Software -Engineering". Verfahren der IFIP Tenth World Computing Conference: 1069–1076.
- ^ Anguiano, Ricardo. "Linux Kernel Mainline 4.9 Sloccount.txt". Kern. Abgerufen 2022-05-04.
- ^ Daintith, John, ed. (2019). "Meta-Assembler". Ein Wörterbuch des Computers. Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24.
- ^ Xerox -Datensysteme (Okt 1975). Xerox Meta-Symbol Sigma 5-9 Computer Sprache und Operationen Referenzhandbuch (PDF). p. vi. Abgerufen 2020-06-07.
- ^ Sperry Univac Computer Systems (1977). Sperry Univac Computer Systems Meta-Assembler (MASM) -Programmiererreferenz (PDF). Abgerufen 2020-06-07.
- ^ "So verwenden Sie Inline -Montagesprache im C -Code". gnu.org. Abgerufen 2020-11-05.
- ^ a b c d Salomon, David (Februar 1993) [1992]. Geschrieben an der California State University, Northridge, Kalifornien, USA. Chivers, Ian D. (Hrsg.). Assembler und Lader (PDF). Ellis Horwood -Serie in Computern und ihren Anwendungen (1. Aufl.). Chicester, West Sussex, Großbritannien: Ellis Horwood Limited / Simon & Schuster International Group. S. 7, 237–238. ISBN 0-13-052564-2. Archiviert (PDF) vom Original am 2020-03-23. Abgerufen 2008-10-01. (xiv+294+4 Seiten)
- ^ Finlayson, Ian; Davis, Brandon; Gavin, Peter; Äh, Gang-Ryung; Whalley, David; Sjärlander, Magnus; Tyson, Gary (2013). "Verbesserung der Prozessor -Effizienz durch statisch pipelinierende Anweisungen". Verfahren der 14. ACM Sigplan/Sigbed -Konferenz über Sprachen, Compiler und Werkzeuge für eingebettete Systeme. S. 33–44. doi:10.1145/2465554.2465559. ISBN 9781450320856. S2CID 8015812.
- ^ Beck, Leland L. (1996). "2". Systemsoftware: Eine Einführung in die Systemprogrammierung. Addison Wesley.
- ^ a b Hyde, Randall (September 2003) [1996-09-30]. "Vorwort (" Warum sollte jemand dieses Zeug lernen? ") / Kapitel 12 - Klassen und Objekte". Die Kunst der Versammlungssprache (2 ed.). Keine Stärkepresse. ISBN 1-886411-97-2. Archiviert von das Original Am 2010-05-06. Abgerufen 2020-06-22. Errata: [1] (928 Seiten) [2][3]
- ^ a b c d Handbuch des Intel Architecture Softwareentwicklers, Band 2: Anweisungssatzreferenz (PDF). Vol. 2. Intel Corporation. 1999. archiviert von das Original (PDF) am 2009-06-11. Abgerufen 2010-11-18.
- ^ Ferrari, Adam; Batson, Alan; Mangel, Mike; Jones, Anita (2018-11-19) [Frühjahr 2006]. Evans, David (Hrsg.). "X86 Assembly Guide". Informatik CS216: Programm- und Datenrepräsentation. Universität von Virginia. Archiviert vom Original am 2020-03-24. Abgerufen 2010-11-18.
- ^ "Das SPARC Architecture Manual, Version 8" (PDF). Sparc International. 1992. archiviert von das Original (PDF) Am 2011-12-10. Abgerufen 2011-12-10.
- ^ Moxham, James (1996). "Zint Z80 Dolmetscher". Z80 OP -Codes für Zint. Archiviert vom Original am 2020-03-24. Abgerufen 2013-07-21.
- ^ Hyde, Randall. "Kapitel 8. MASM: Richtlinien & Pseudo-Opcode" (PDF). Die Kunst der Computerprogrammierung. Archiviert (PDF) vom Original am 2020-03-24. Abgerufen 2011-03-19.
- ^ Benutzer von 1401 Autocoder. Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24.
- ^ Griswold, Ralph E. (1972). "Kapitel 1". Die Makroimplementierung von Snobol4. San Francisco, Kalifornien, USA: W. H. Freeman und Firma. ISBN 0-7167-0447-1.
- ^ "Makros (C/C ++), MSDN -Bibliothek für Visual Studio 2008". Microsoft Corp. 2012-11-16. Archiviert vom Original am 2020-03-24. Abgerufen 2010-06-22.
- ^ Kessler, Marvin M. (1970-12-18). "* Konzept* Bericht 14 - Implementierung von Makros, um eine strukturierte Programmierung in OS/360 zu ermöglichen.". MVS -Software: Konzept 14 Makros. Gaithersburg, Maryland, USA: International Business Machines Corporation. Archiviert vom Original am 2020-03-24. Abgerufen 2009-05-25.
- ^ "High Level Assembler Toolkit -Funktion erhöht die Programmiererproduktivität". IBM. 1995-12-12. Ankündigungsschreibennummer: A95-1432.
- ^ "Assemblersprache: Definition und vieles mehr von Answers.com". Answers.com. Archiviert von das Original am 2009-06-08. Abgerufen 2008-06-19.
- ^ Provinciano, Brian (2005-04-17). "Neshla: Die hohe Ebene, Open Source, 6502 Assembler für das Nintendo Entertainment System". Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24.
- ^ DUFRESNE, Steven (2018-08-21). "Kathleen Booth: Frühe Computer zusammenstellen beim Erfindung der Baugruppe". Archiviert vom Original am 2020-03-24. Abgerufen 2019-02-10.
- ^ a b Stand Andrew Donald; Britten, Kathleen Hylda Valerie (September 1947) [August 1947]. Allgemeine Überlegungen bei der Gestaltung eines elektronischen digitalen Allzweck -Computers (PDF) (2 ed.). Das Institut für fortgeschrittenes Studium, Princeton, New Jersey, USA: Birkbeck College, London. Archiviert (PDF) vom Original am 2020-03-24. Abgerufen 2019-02-10.
Die im folgenden Text enthaltenen nicht originalen Ideen wurden aus einer Reihe von Quellen abgeleitet. Diskussionen ...
- ^ Campbell-Kelly, Martin (April 1982). "Die Entwicklung der Computerprogrammierung in Großbritannien (1945 bis 1955)". IEEE Annals of the History of Computing. 4 (2): 121–139. doi:10.1109/mahc.1982.10016. S2CID 14861159.
- ^ Campbell-Kelly, Martin (1980). "Programmieren des EDSAC". IEEE Annals of the History of Computing. 2 (1): 7–36. doi:10.1109/mahc.1980.10009.
- ^ "1985 Computer Pioneer Award 'für die Assemblersprachenprogrammierung' David Wheeler".
- ^ Wilkes, Maurice Vincent (1949). "Der EDSAC - eine elektronische Berechnungsmaschine". Journal of Scientific Instrumente. 26 (12): 385–391. Bibcode:1949jsci ... 26..385w. doi:10.1088/0950-7671/26/12/301.
- ^ DA Cruz, Frank (2019-05-17). "Der IBM 650 Magnetic Drum Taschenrechner". Computerhistorie - Eine Chronologie des Computers. Universität von Columbia. Archiviert vom Original am 2020-02-15. Abgerufen 2012-01-17.
- ^ Collen, Morris F. (März - April 1994). "Die Ursprünge der Informatik". Zeitschrift der American Medical Informatics Association. 1 (2): 96–97. doi:10.1136/jamia.1994.95236152. PMC 116189. PMID 7719803.
- ^ Pettus, Sam (2008-01-10). "Segabase Volume 6 - Saturn". Archiviert von das Original am 2008-07-13. Abgerufen 2008-07-25.
- ^ Kauler, Barry (1997-01-09). Windows-Montage-Sprache und Systemprogrammierung: 16- und 32-Bit-Programmierung mit niedriger Ebene für PC und Windows. CRC Press. ISBN 978-1-48227572-8. Abgerufen 2020-03-24.
Die Debatte wird immer über die Anwendbarkeit der Versammlungssprache in unserer modernen Programmierwelt tobt.
- ^ Hsieh, Paul (2020-03-24) [2016, 1996]. "Programmieroptimierung". Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24.
... Designänderungen beeinflussen die Leistung mehr als ... man sollte nicht direkt zur Montagesprache überspringen, bis ...
- ^ "Tiobe Index". Tiobe -Software. Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24.
- ^ Rusling, David A. (1999) [1996]. "Kapitel 2 Software -Grundlagen". Der Linux -Kernel. Archiviert vom Original am 2020-03-24. Abgerufen 2012-03-11.
- ^ a b Markoff, John Gregory (2005-11-28). "Schreiben Sie den schnellsten Code von Hand zum Spaß: Ein menschlicher Computer beschleunigt immer wieder Chips". Die New York Times. Seattle, Washington, USA. Archiviert vom Original am 2020-03-23. Abgerufen 2010-03-04.
- ^ "Bitfeld-Badness". HardwareBug.org. 2010-01-30. Archiviert von das Original Am 2010-02-05. Abgerufen 2010-03-04.
- ^ "GCC macht ein Chaos". HardwareBug.org. 2009-05-13. Archiviert von das Original Am 2010-03-16. Abgerufen 2010-03-04.
- ^ Hyde, Randall. "Die große Debatte". Archiviert von das Original am 2008-06-16. Abgerufen 2008-07-03.
- ^ "Code -Sourcery schlägt wieder fehl". HardwareBug.org. 2010-01-30. Archiviert von das Original Am 2010-04-02. Abgerufen 2010-03-04.
- ^ Klicken Sie, Cliff; Goetz, Brian. "Ein Crashkurs in modernen Hardware". Archiviert vom Original am 2020-03-24. Abgerufen 2014-05-01.
- ^ "68K -Programmierung in Fargo II". Archiviert vom Original am 2008-07-02. Abgerufen 2008-07-03.
- ^ "BLAS Benchmark-August2008". igen.tuxfamily.org. 2008-08-01. Archiviert vom Original am 2020-03-24. Abgerufen 2010-03-04.
- ^ "x264.git/Common/x86/dct-32.asm". git.videolan.org. 2010-09-29. Archiviert von das Original Am 2012-03-04. Abgerufen 2010-09-29.
- ^ Bosworth, Edward (2016). "Kapitel 1 - Warum die Sprache der Versammlung studieren". www.edwardbosworth.com. Archiviert vom Original am 2020-03-24. Abgerufen 2016-06-01.
- ^ "Z/OS Version 2 Release 3 DFSMS -Makroanweisungen für Datensätze" (PDF). IBM. 2019-02-15. Archiviert (PDF) vom Original am 2021-06-25. Abgerufen 2021-09-14.
- ^ Paul, Matthias R. (2001) [1996], "Spezifikation und Referenzdokumentation für Necpinw", Necpinw.cpi - DOS -Code -Seiten -Switching -Treiber für NEC Pinwriters (2.08 ed.), Filespec.txt, necpinw.asm, Eurofont.inc von necpi208.zip, archiviert vom Original am 2017-09-10, abgerufen 2013-04-22
- ^ Paul, Matthias R. (2002-05-13). "[fd-dev] meyb". Freedos-dev. Archiviert vom Original am 2018-09-10. Abgerufen 2018-09-10.
Weitere Lektüre
- Bartlett, Jonathan (2004). Programmierung von Grund auf - eine Einführung in die Programmierung mit der Linux -Montagesprache. Bartlett Publishing. ISBN 0-9752838-4-7. Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24. [4]
- Britton, Robert (2003). MIPS -Assembler -Sprachprogrammierung. Prentice Hall. ISBN 0-13-142044-5.
- Calingaert, Peter (1979) [1978-11-05]. Geschrieben bei Universität von North Carolina in Chapel Hill. Horowitz, Ellis (ed.). Absammler, Compiler und Programmübersetzung. Computer Software Engineering Series (1. Druck, 1. Aufl.). Potomac, Maryland, USA: Informatik Press, Inc. ISBN 0-914894-23-4. ISSN 0888-2088. Lccn 78-21905. Abgerufen 2020-03-20. (2+xiv+270+6 Seiten)
- Duntemann, Jeff (2000). Assemblersprache Schritt für Schritt. Wiley. ISBN 0-471-37523-3.
- Kann, Charles W. (2015). "Einführung in die MIPS -Assembler -Sprachprogrammierung". Archiviert vom Original am 2020-03-24. Abgerufen 2020-03-24.
- Kann, Charles W. (2021). "Einführung in die Montagesprachprogrammierung: Von Suppe zu Nüssen: Arm Edition"
- Norton, Peter; Socha, John (1986). Peter Nortons Assembler -Sprachbuch für den IBM PC. New York, USA: Brady Books.
- Sänger Michael (1980). PDP-11. Assembler -Sprachprogrammierung und Maschinenorganisation. New York, USA: John Wiley & Sons.
- Sweetman, Dominic (1999). Siehe MIPS Run. Morgan Kaufmann Publishers. ISBN 1-55860-410-3.
- Waldron, John (1998). Einführung in die RISC -Assembler -Sprachprogrammierung. Addison Wesley. ISBN 0-201-39828-1.
- Yurichev, Dennis (2020-03-04) [2013]. "Verständnis der Montagesprache (Reverse Engineering für Anfänger)" (PDF). Archiviert (PDF) vom Original am 2020-03-24. Abgerufen 2020-03-24.
- "ASM Community Book". 2009. archiviert von das Original Am 2013-05-30. Abgerufen 2013-05-30. ("Ein Online -Buch voller hilfreicher ASM -Informationen, Tutorials und Code -Beispiele" von der ASM -Community, archiviert im Internet -Archiv.)
Externe Links
- Montagesprache bei Curlie
- UNIX -Assembler -Sprachprogrammierung
- Linux -Baugruppe
- PPR: Lernversammlungssprache lernen
- Nasm - der netzweite Assembler (eine beliebte Montagesprache)
- Beispiele für Assemblersprachenprogrammierungen
- Autoring Windows -Anwendungen in der Montagesprache
- Tipps zur Montageoptimierung von Mark Larson
- Die Tabelle für die Montagesprache zu Maschinencode