Zusammenbau-Sprache

:See die Fachsprache-Abteilung unten für die Information bezüglich des inkonsequenten Gebrauches der Begriffe Zusammenbau und Monteur.

Eine Zusammenbau-Sprache ist eine auf niedriger Stufe Programmiersprache für Computer, Mikroprozessoren, Mikrokontrolleure und andere programmierbare Geräte, in denen jede Behauptung einer einzelnen Maschinensprachinstruktion entspricht. Eine Zusammenbau-Sprache ist zu einer bestimmten Computerarchitektur im Gegensatz zu den meisten Programmiersprachen auf höchster Ebene spezifisch, die mehr tragbar sein können.

Zusammenbau-Sprache verwendet 'mnemonische Codes' oder 'Symbole'. Anstatt sich an die genauen Speicherpositionen zu erinnern, wo Daten und Instruktionen versorgt werden, werden symbolische Speicheradressen für Daten verwendet.

Ein Dienstprogramm hat gerufen ein Monteur wird verwendet, um Zusammenbau-Sprachbehauptungen in den Zielcomputermaschinencode zu übersetzen.

Im normalen Berufsgebrauch wird der Begriff Monteur gebraucht, um sich sowohl auf eine Zusammenbau-Sprache, als auch auf die Software zu beziehen, die ein mit dem Zusammenbau sprachiges Programm sammelt. So: "BEDIENUNGSFELD/CM wurde im S/360 Monteur geschrieben", sowie "ASM-H war ein weit verwendeter S/370 Monteur."

Viele Monteure bieten zusätzliche Mechanismen an, Programm-Entwicklung zu erleichtern, den Zusammenbau-Prozess und das Hilfsbeseitigen zu kontrollieren. Monteure schließen häufig eine Makromöglichkeit (beschrieben unten) ein, und werden Makromonteure genannt.

Schlüsselkonzepte

Monteur

Ein Monteur schafft Gegenstand-Code durch das Übersetzen der Montageanleitungsgedächtniskunst in opcodes, und durch die Auflösung von symbolischen Namen für Speicherpositionen und andere Entitäten. Der Gebrauch von symbolischen Verweisungen ist ein Hauptmerkmal von Monteuren, langweilige Berechnungen und manuelle Adressaktualisierungen nach Programmänderungen sparend. Die meisten Monteure schließen auch Makromöglichkeiten ein, um textlichen Ersatz z.B durchzuführen. um allgemeine kurze Folgen von Instruktionen als Reihen-statt genannter Unterprogramme zu erzeugen.

Monteure sind seit den 1950er Jahren verfügbar gewesen und sind viel einfacher zu schreiben als Bearbeiter für höhere Programmiersprachen als jede mnemonische Instruktion / Adressweise-Kombination übersetzt direkt in eine einzelne Maschinensprache opcode. Moderne Monteure, besonders für RISC Architekturen, wie SPARC oder MACHT, sowie x86 und x86-64, optimieren Instruktion, die plant, die Zentraleinheitsrohrleitung effizient auszunutzen.

Zahl von Pässen

Es gibt zwei Typen von Monteuren, die darauf gestützt sind, wie vieler durchgeht, die Quelle sind erforderlich, um das rechtskräftige Programm zu erzeugen.

  • Einpass-Monteure gehen den Quellcode einmal durch. Jedes verwendete Symbol, bevor es definiert wird, wird "Errata" am Ende des Gegenstand-Codes verlangen (oder, mindestens, nicht früher als der Punkt, wo das Symbol definiert wird) das Erzählen des linker oder des Laders, um "zurückzugehen" und einen Platzhalter zu überschreiben, der verlassen worden war, wo das bis jetzt unbestimmte Symbol verwendet wurde.
  • Mehrpass-Monteure schaffen einen Tisch mit allen Symbolen und ihren Werten in den ersten Pässen, verwenden dann den Tisch in späteren Pässen, um Code zu erzeugen.

In beiden Fällen muss der Monteur im Stande sein, die Größe jeder Instruktion auf den anfänglichen Pässen zu bestimmen, um die Adressen von Symbolen zu berechnen. Das bedeutet, dass, wenn die Größe einer Operation, die sich auf einen operand bezieht, später definiert hat, vom Typ oder der Entfernung des operand abhängt, wird der Monteur eine pessimistische Schätzung machen, wenn er zuerst auf die Operation stoßen wird, und sie nötigenfalls mit einer oder mehr Instruktionen "ohne Operationen" in einem späteren Pass oder den Errata auspolstern. In einem Monteur mit der Guckloch-Optimierung können Adressen zwischen Pässen wiederberechnet werden, um zu erlauben, pessimistischen Code durch den Code zu ersetzen, der zur genauen Entfernung vom Ziel geschneidert ist.

Der ursprüngliche Grund für den Gebrauch von Einpass-Monteuren war Geschwindigkeit des Zusammenbaues; jedoch führen moderne Computer Mehrpass-Zusammenbau ohne unannehmbare Verzögerung durch. Der Vorteil des Mehrpass-Monteurs besteht darin, dass die Abwesenheit eines Bedürfnisses nach Errata den linker macht (oder der Lader, wenn der Monteur direkt rechtskräftigen Code erzeugt) einfacher und schneller.

Monteure auf höchster Ebene

Hoch entwickeltere Monteure auf höchster Ebene stellen Sprachabstraktionen zur Verfügung wie:

  • Fortgeschrittene Kontrollstrukturen
  • Behauptungen des Verfahrens/Funktion auf höchster Ebene und Beschwörungen
  • Abstrakte Datentypen auf höchster Ebene, einschließlich Strukturen/Aufzeichnungen, Vereinigungen, Klassen und Sätze
  • Hoch entwickelte Makroverarbeitung (obwohl verfügbar, auf gewöhnlichen Monteuren seit dem Ende der 1950er Jahre für die Reihe von IBM 700 und seit den 1960er Jahren für IBM/360, unter anderen Maschinen)
  • Objektorientierte Programmiereigenschaften wie Klassen, Gegenstände, Abstraktion, polymorphism, und Erbe

Sieh Sprachdesign unten für mehr Details.

Zusammenbau-Sprache

Ein auf der Zusammenbau-Sprache geschriebenes Programm besteht aus einer Reihe von (mnemonischen) Verarbeiter-Instruktionen und Meta-Erklärungen (bekannt verschiedenartig als Direktiven, Pseudobefehle und pseudo-ops), Anmerkungen und Daten. Zusammenbau-Sprachinstruktionen bestehen gewöhnlich aus einem opcode mnemonischen, der von einer Liste von Daten, Argumenten oder Rahmen gefolgt ist. Diese werden durch einen Monteur in Maschinensprachinstruktionen übersetzt, die ins Gedächtnis geladen und durchgeführt werden können.

Zum Beispiel, die Instruktion, die x86/IA-32 Verarbeiter sagt, einen unmittelbaren 8-Bit-Wert in ein Register zu bewegen. Der binäre Code für diese Instruktion ist 10110 gefolgte durch einen 3-Bit-Bezeichner für der Register zu verwenden. Der Bezeichner für das AL-Register ist 000, so lädt der folgende Maschinencode das AL-Register mit den Daten 01100001.

10110000 01100001

Dieser binäre Computercode kann menschlich-lesbarer durch das Ausdrücken davon in hexadecimal wie folgt gemacht werden

B0 61

Hier bewegen Mittel 'Eine Kopie des folgenden Werts in AL', und ist eine hexadecimal Darstellung des Werts 01100001, der 97 in der Dezimalzahl ist. Zusammenbau-Sprache von Intel stellt den mnemonischen MOV (eine Abkürzung der Bewegung) für Instruktionen wie das zur Verfügung, so kann der Maschinencode oben wie folgt auf der Zusammenbau-Sprache geschrieben, mit einer erklärenden Anmerkung auf Anfrage nach dem Strichpunkt abgeschlossen werden. Das ist viel leichter, zu lesen und sich zu erinnern.

Auf einigen Zusammenbau-Sprachen kann dasselbe mnemonisch wie MOV für eine Familie von zusammenhängenden Instruktionen für das Laden, das Kopieren und die bewegenden Daten verwendet werden, ob diese unmittelbare Werte, Werte in Registern sind, oder Speicherpositionen haben zu durch Werte in Registern hingewiesen. Andere Monteure können getrennten opcodes wie L für das "Bewegungsgedächtnis zum Register verwenden" schreibt sich ST für die "Bewegung zum Gedächtnis ein" schreiben sich LR für die "Bewegung ein, um sich", MVI für die "Bewegung unmittelbarer operand zum Gedächtnis", usw. einzuschreiben.

Intel opcode 10110000 kopiert einen 8-Bit-Wert ins AL-Register, während sich 10110001 bewegt, tut es in die KL. und 10110010 so in DL. Zusammenbau-Sprachbeispiele für diese folgen.

MOV AL, 1h; Laden Sie AL mit dem unmittelbaren Wert 1

MOV KL., 2h; Last-KL. mit dem unmittelbaren Wert 2

MOV DL, 3h; Laden Sie DL mit dem unmittelbaren Wert 3

</Quelle>

Die Syntax von MOV kann auch komplizierter sein, weil sich die folgenden Beispiele zeigen.

MOV EAX, [EBX] ; Bewegen Sie die 4 Bytes im Gedächtnis an der Adresse, die in EBX in EAX enthalten ist

MOV [ESI+EAX], KL.; Bewegen Sie den Inhalt der KL. ins Byte an der Adresse ESI+EAX

</Quelle>

In jedem Fall wird das MOV mnemonische direkt in einen opcode in den Reihen 88-8E, A0-A3, B0-B8, C6 oder C7 durch einen Monteur übersetzt, und der Programmierer muss nicht wissen oder sich der erinnern.

Das Umwandeln der Zusammenbau-Sprache in den Maschinencode ist der Job eines Monteurs, und die Rückseite kann mindestens durch einen Zurückübersetzer teilweise erreicht werden. Verschieden von höheren Programmiersprachen gibt es gewöhnlich eine isomorphe Ähnlichkeit zwischen einfachen Zusammenbau-Erklärungen und Maschinensprachinstruktionen. Jedoch, in einigen Fällen, kann ein Monteur Pseudobefehle zur Verfügung stellen (im Wesentlichen Makros), die sich in mehrere Maschinensprachinstruktionen ausbreiten, allgemein erforderliche Funktionalität zur Verfügung zu stellen. Zum Beispiel, für eine Maschine, die an einem "Zweig Mangel hat, wenn größere oder gleiche" Instruktion, ein Monteur einen Pseudobefehl zur Verfügung stellen kann, der sich zum "Satz der Maschine wenn weniger ausbreitet als" und "Zweig wenn Null (auf dem Ergebnis der Satz-Instruktion)". Die meisten voll gezeigten Monteure stellen auch eine reiche Makrosprache zur Verfügung (besprochen unten), der von Verkäufern und Programmierern verwendet wird, um komplizierteren Code und Datenfolgen zu erzeugen.

Jede Computerarchitektur hat seine eigene Maschinensprache. Computer unterscheiden sich in der Zahl und dem Typ von Operationen, die sie, in den verschiedenen Größen und Zahlen von Registern, und in den Darstellungen von Daten in der Lagerung unterstützen. Während die meisten Mehrzweckcomputer im Stande sind, im Wesentlichen dieselbe Funktionalität, die Wege auszuführen, unterscheiden sie sich wirklich so; die entsprechenden Zusammenbau-Sprachen widerspiegeln diese Unterschiede.

Vielfache Sätze der Gedächtniskunst oder mit dem Zusammenbau sprachigen Syntax können für einen einzelnen Befehlssatz bestehen, der normalerweise in verschiedenen Assemblerprogrammen realisiert ist. In diesen Fällen ist der populärste gewöhnlich das, das vom Hersteller geliefert ist und in seiner Dokumentation verwendet ist.

Sprachdesign

Grundelemente

Es gibt einen großen Grad der Ungleichheit in der Weise, wie die Autoren von Monteuren Behauptungen und in der Nomenklatur kategorisieren, die sie verwenden. Insbesondere einige beschreiben etwas anderes als eine Maschine mnemonisch oder verlängert mnemonisch als eine Pseudooperation (pseudo-op). Eine typische Zusammenbau-Sprache besteht aus 3 Typen von Instruktionsbehauptungen, die verwendet werden, um Programm-Operationen zu definieren:

  • Gedächtniskunst von Opcode
  • Datenabteilungen
  • Zusammenbau-Direktiven

Gedächtniskunst von Opcode und erweiterte Gedächtniskunst

Instruktionen (Behauptungen) auf der Zusammenbau-Sprache, sind verschieden von denjenigen auf der höheren Programmiersprache allgemein sehr einfach. Allgemein ist ein mnemonischer ein symbolischer Name für eine einzelne rechtskräftige Maschinensprachinstruktion (ein opcode), und es gibt mindestens einen opcode mnemonisch definiert für jede Maschinensprachinstruktion. Jede Instruktion besteht normalerweise aus einer Operation oder opcode plus die Null oder mehr operands. Die meisten Instruktionen beziehen sich auf einen einzelnen Wert oder ein Paar von Werten. Operands kann (Wert unmittelbar sein, der in der Instruktion selbst codiert ist), Register, die in der Instruktion angegeben sind oder, oder die Adressen von Daten einbezogen sind, gelegen anderswohin in der Lagerung. Das wird durch die zu Grunde liegende Verarbeiter-Architektur bestimmt: Der Monteur widerspiegelt bloß, wie diese Architektur arbeitet. Verlängerte Gedächtniskunst wird häufig verwendet, um eine Kombination eines opcode mit einem spezifischen operand z.B anzugeben, die Monteure des Systems/360 verwenden B als ein verlängerter mnemonischer für v. Chr. mit einer Maske 15 und NOP für v. Chr. mit einer Maske 0.

Verlängerte Gedächtniskunst wird häufig verwendet, um spezialisierten Gebrauch von Instruktionen häufig zu vom Instruktionsnamen nicht offensichtlichen Zwecken zu unterstützen. Zum Beispiel viele hat Zentraleinheit keine ausführliche NOP Instruktion, aber hat wirklich Instruktionen, die zum Zweck verwendet werden können. In 8086 Zentraleinheiten die Instruktion xchg Axt wird Axt für nop mit nop verwendet ein pseudo-opcode zu sein, um die Instruktion xchg Axt, Axt zu verschlüsseln. Einige Zurückübersetzer erkennen das an und werden die xchg Axt, Axt-Instruktion als nop decodieren. Ähnlich verwenden Monteure von IBM für das System/360 und System/370 die verlängerte Gedächtniskunst NOP und NOPR für v. Chr. und BCR mit Nullmasken. Für die SPARC Architektur sind diese als synthetische Instruktionen bekannt

Einige Monteure unterstützen auch einfache eingebaute Makrobefehle, die zwei oder mehr Maschineninstruktionen erzeugen. Zum Beispiel, mit einigen Z80 Monteuren, wie man anerkennt, erzeugt die Instruktion ld hl, bc ld l, c gefolgt von ld h, b. Diese sind manchmal als pseudo-opcodes bekannt.

Datenabteilungen

Es gibt Instruktionen, die verwendet sind, um Datenelemente zu definieren, um Daten und Variablen zu halten. Sie definieren den Typ von Daten, der Länge und der Anordnung von Daten. Diese Instruktionen können auch definieren, ob die Daten für Außenprogramme (Programme gesammelt getrennt) oder nur für das Programm verfügbar sind, in dem die Datenabteilung definiert wird. Einige Monteure klassifizieren diese als pseudo-ops.

Zusammenbau-Direktiven

Zusammenbau-Direktiven, auch genannt Pseudoopcodes, Pseudooperationen oder pseudo-ops, sind Instruktionen, die durch einen Monteur in der Montagezeit durchgeführt werden, nicht durch eine Zentraleinheit in der Durchlaufzeit. Sie können den Zusammenbau des Programm-Abhängigen auf von einem Programmierer eingegebenen Rahmen machen, so dass ein Programm verschiedene Wege vielleicht für verschiedene Anwendungen gesammelt werden kann. Sie können auch verwendet werden, um Präsentation eines Programms zu manipulieren, um es leichter zu machen, zu lesen und aufrechtzuerhalten.

(Zum Beispiel würden Direktiven verwendet, um Speicherbereiche und fakultativ ihren anfänglichen Inhalt vorzubestellen.) Die Namen von Direktiven fangen häufig mit einem Punkt an, sie aus Maschineninstruktionen zu unterscheiden.

Symbolische Monteure lassen Programmierer willkürliche Namen (Etiketten oder Symbole) mit Speicherpositionen vereinigen. Gewöhnlich wird jeder Konstante und variabel ein Name gegeben, so können Instruktionen in jenen Positionen namentlich Verweise anbringen, so sprechenden Code fördernd. Im rechtskräftigen Code wird der Name jedes Unterprogramms mit seinem Zugang-Punkt vereinigt, so können irgendwelche Anrufe zu einem Unterprogramm seinen Namen verwenden. Innerhalb von Unterprogrammen werden GOTO Bestimmungsörter Etiketten gegeben. Einige Monteure unterstützen lokale Symbole, die von normalen Symbolen (z.B, der Gebrauch von "10 $" als ein GOTO Bestimmungsort) lexikalisch verschieden sind.

Einige Monteure stellen flexibles Symbol-Management zur Verfügung, lassende Programmierer führen verschiedenen namespaces, berechnen automatisch Ausgleiche innerhalb von Datenstrukturen, und teilen Etiketten zu, die sich auf wörtliche Werte oder das Ergebnis der einfachen durch den Monteur durchgeführten Berechnung beziehen. Etiketten können auch verwendet werden, um Konstanten und Variablen mit relokatierbaren Adressen zu initialisieren.

Zusammenbau-Sprachen, wie die meisten anderen Computersprachen, erlauben Anmerkungen, zum Zusammenbau-Quellcode hinzugefügt zu werden, die durch den Monteur ignoriert werden. Der gute Gebrauch von Anmerkungen ist mit dem Zusammenbau-Code noch wichtiger als mit Sprachen des höheren Niveaus, weil die Bedeutung und der Zweck einer Folge von Instruktionen härter ist, aus dem Code selbst zu entziffern.

Der kluge Gebrauch dieser Möglichkeiten kann die Probleme des Codierens und Aufrechterhaltens des auf niedriger Stufe Codes außerordentlich vereinfachen. Roher Zusammenbau-Quellcode, wie erzeugt, durch Bearbeiter oder Zurückübersetzer — codiert ohne irgendwelche Anmerkungen, bedeutungsvolle Symbole, oder Datendefinitionen — sind ziemlich schwierig zu lesen, wenn Änderungen vorgenommen werden müssen.

Makros

Viele Monteure unterstützen vorherbestimmte Makros, und andere unterstützen Programmierer-definiert (und wiederholt wiederdefinierbar) Makros, die Folgen von Textlinien einschließen, in denen Variablen und Konstanten eingebettet werden. Diese Folge von Textlinien kann opcodes oder Direktiven einschließen. Sobald ein Makro definiert worden ist, kann sein Name im Platz eines mnemonischen verwendet werden. Wenn der Monteur solch eine Behauptung bearbeitet, ersetzt er die Behauptung durch die Textlinien, die mit diesem Makro vereinigt sind, bearbeitet sie dann, als ob sie in der Quellcodedatei (einschließlich, in einigen Monteuren, Vergrößerung irgendwelcher Makros bestanden haben, die im Ersatztext vorhanden sind).

Bemerken Sie, dass diese Definition von "Makro-" vom Gebrauch des Begriffes in anderen Zusammenhängen wie die C Programmiersprache ein bisschen verschieden ist. C Makro hat durch #define geschaffen Direktive ist normalerweise gerade eine Linie oder einige Linien höchstens. Monteur Makroinstruktionen kann lange "Programme" durch sich, durchgeführt durch die Interpretation durch den Monteur während des Zusammenbaues sein.

Da Makros 'kurze' Namen haben, aber sich zu mehreren oder tatsächlich vielen Linien des Codes ausbreiten können, können sie verwendet werden, um Zusammenbau-Sprachprogramme scheinen zu lassen, viel kürzer zu sein, weniger Linien des Quellcodes, als mit höheren Niveau-Sprachen verlangend. Sie können auch verwendet werden, um höhere Niveaus der Struktur zu Zusammenbau-Programmen hinzuzufügen, fakultativ eingebetteten Beseitigen-Code über Rahmen und andere ähnliche Eigenschaften einzuführen.

Viele Monteure haben eingebaut (oder vorherbestimmt) Makros für Systemanrufe und andere spezielle Codefolgen, wie die Generation und Lagerung von Daten, die durch fortgeschrittenen bitwise und boolean Operationen begriffen sind, die in Spielen, Softwaresicherheit, Datenverwaltung und Geheimschrift verwendet sind.

Makromonteure erlauben häufig Makros, Rahmen zu nehmen. Einige Monteure schließen ziemlich hoch entwickelte Makrosprachen ein, solche Elemente der höheren Programmiersprache als fakultative Rahmen, symbolische Variablen, conditionals vereinigend, spannen Manipulation und arithmetische Operationen, alle, die während der Ausführung eines gegebenen Makros verwendbar sind, und Makros erlaubend, Zusammenhang oder Austauschinformation zu sparen. So könnte ein Makro eine Vielzahl von Zusammenbau-Sprachinstruktionen oder Datendefinitionen erzeugen, die auf den Makroargumenten gestützt sind. Das konnte verwendet werden, um rekordartige Datenstrukturen oder "entrollte" Schleifen zum Beispiel zu erzeugen, oder konnte komplette auf komplizierten Rahmen gestützte Algorithmen erzeugen. Wie man betrachten kann, arbeitet eine Organisation mit der Zusammenbau-Sprache, die mit solch einem Makrogefolge schwer erweitert worden ist, auf einer Sprache des höheren Niveaus, da solche Programmierer mit einem Tiefststand eines Computers Begriffselemente nicht arbeiten.

Makros wurden verwendet, um in großem Umfang Softwaresysteme für spezifische Kunden im Großrechner-Zeitalter kundengerecht anzufertigen, und wurden auch vom Kundenpersonal verwendet, um die Bedürfnisse ihrer Arbeitgeber durch das Bilden spezifischer Versionen des Herstellers Betriebssysteme zu befriedigen. Das wurde zum Beispiel von Systemprogrammierern getan, die mit Conversational Monitor System / Virtual Machine (CMS/VM) von IBM und mit der "Echtzeittransaktion von IBM arbeiten, die" Erweiterungen, CICS, Kundeninformationsregelsystem, und ACP/TPF, das Luftfahrtgesellschaft-System / finanzielle System bearbeitet, das in den 1970er Jahren begonnen hat und noch viele große Computerbedenken-Systeme (CRS) und Kreditkartensysteme heute führt.

Es war auch möglich, allein die in einer Prozession gehenden geistigen Makroanlagen eines Monteurs zu verwenden, Code zu erzeugen, der auf völlig verschiedenen Sprachen geschrieben ist, zum Beispiel eine Version eines Programms im COBOL mit einem reinen Makroassemblerprogramm zu erzeugen, das Linien des COBOL-Codes innerhalb von Montagezeit-Maschinenbedienern enthält, die den Monteur beauftragen, willkürlichen Code zu erzeugen.

Das war, weil, wie in den 1960er Jahren begriffen wurde, das Konzept der "Makroverarbeitung" des Konzepts "des Zusammenbaues", der erstere unabhängig ist, in modernen Begriffen mehr Textverarbeitung, Textverarbeitung seiend, als das Erzeugen des Gegenstand-Codes. Das Konzept der Makroverarbeitung ist erschienen, und erscheint auf der C Programmiersprache, die "Vorverarbeiter-Instruktionen" unterstützt, um Variablen zu setzen, und bedingte Tests auf ihren Werten zu machen. Bemerken Sie, dass verschieden von bestimmten vorherigen Makroverarbeitern innerhalb von Monteuren der C Vorverarbeiter nicht Turing-abgeschlossen war, weil er gefehlt hat, die Fähigkeit sich entweder zu schlingen oder "gehen zu", die letzten erlaubenden Programme, um sich zu schlingen.

Trotz der Macht der Makroverarbeitung ist es in den Nichtgebrauch auf vielen hohen Sprachen (Hauptausnahmen gefallen, die C/C ++ und PL/I sind), während es ein beständiger für Monteure geblieben ist.

Makroparameter-Ersatz ist ausschließlich namentlich: In der Makroverarbeitungszeit wird gegen den Wert eines Parameters seinen Namen textlich ausgewechselt. Die berühmteste Klasse von resultierenden Programmfehlern war der Gebrauch eines Parameters, der selbst ein Ausdruck und nicht ein einfacher Name war, als der Makroschriftsteller einen Namen erwartet hat. Im Makro:

foo: Makro-ein

laden Sie a*b

</tt>

die Absicht bestand darin, dass der Anrufer den Namen einer Variable zur Verfügung stellen würde, und der "globale" variable oder unveränderliche b verwendet würde, "um a" zu multiplizieren. Wenn foo mit dem Parameter genannt wird, kommt die Makrovergrößerung dessen vor. Um jede mögliche Zweideutigkeit zu vermeiden, können Benutzer von Makroverarbeitern parenthesize formelle Rahmen innerhalb von Makrodefinitionen, oder Anrufer können parenthesize die Eingangsrahmen.

PL/I und C/C ++ können Eigenschaft-Makros, aber diese Möglichkeit nur Text manipulieren. Andererseits, homoiconic Sprachen, wie Lispeln, behält Einleitung, und Hervor, die Macht von Zusammenbau-Sprachmakros, weil sie im Stande sind, ihren eigenen Code als Daten zu manipulieren.

Unterstützung für die strukturierte Programmierung

Einige Monteure haben strukturierte Programmierelemente vereinigt, um Ausführungsfluss zu verschlüsseln. Das frühste Beispiel dieser Annäherung war im Konzept 14 Makrosatz, der ursprünglich von Dr H.D. Mills (März 1970) vorgeschlagen ist, und hat durch Marvin Kessler an der Bundessystemabteilung von IBM durchgeführt, die den S/360 Makromonteur mit IF/ELSE/ENDIF und ähnlichen Kontrollfluss-Blöcken erweitert hat. Das war eine Weise, den Gebrauch von GOTO Operationen im Zusammenbau-Code, einem der Hauptfaktoren zu reduzieren oder zu beseitigen, die Spaghetti-Code auf der Zusammenbau-Sprache verursachen. Diese Annäherung wurde am Anfang der 80er Jahre (die letzten Tage des groß angelegten Zusammenbau-Sprachgebrauches) weit akzeptiert.

Ein neugieriges Design war A-natural, ein "Strom-orientierter" Monteur für 8080/Z80 Verarbeiter von Whitesmiths Ltd. (Entwickler des Unix ähnlichen Idris Betriebssystem, und was, wie man berichtete, der erste kommerzielle C Bearbeiter war). Die Sprache wurde als ein Monteur klassifiziert, weil sie mit rohen Maschinenelementen wie opcodes, Register und Speicherverweisungen gearbeitet hat; aber es hat eine Ausdruck-Syntax vereinigt, um Ausführungsordnung anzuzeigen. Parenthesen und andere spezielle Symbole, zusammen mit Block-orientierten strukturierten programmierenden Konstruktionen, haben die Folge der erzeugten Instruktionen kontrolliert. A-natural wurde als die Gegenstand-Sprache eines C Bearbeiters, aber nicht für das Handcodieren gebaut, aber seine logische Syntax hat einige Fächer gewonnen.

Es hat wenig offenbare Nachfrage nach hoch entwickelteren Monteuren seit dem Niedergang der groß angelegten Zusammenbau-Sprachentwicklung gegeben. Trotz dessen werden sie noch entwickelt und in Fällen angewandt, wo Quelleneinschränkungen oder Besonderheiten in der Zielsystemarchitektur den wirksamen Gebrauch von Sprachen des höheren Niveaus verhindern.

Gebrauch der Zusammenbau-Sprache

Historische Perspektive

Zusammenbau-Sprachdatum zur Einführung des speicherprogrammierten Computers. Der EDSAC Computer (1949) hatte einen Monteur genannt anfängliche Ordnungen, die einstellige Gedächtniskunst zeigen. Nathaniel Rochester hat einen Monteur für IBM 701 (1954) geschrieben. SEIFE (Symbolisches Optimales Zusammenbau-Programm) (1955) war eine Zusammenbau-Sprache für den von Stan Poley geschriebenen Computer von IBM 650.

Zusammenbau-Sprachen haben viel von der fehlbaren und zeitraubenden Programmierung der ersten Generation beseitigt, die mit den frühsten Computern, das Freigeben von Programmierern von der Langweiligkeit wie das Erinnern an numerische Codes und Rechnen von Adressen erforderlich ist. Sie wurden einmal für alle Sorten der Programmierung weit verwendet. Jedoch, vor den 1980er Jahren (die 1990er Jahre auf Mikrocomputern), war ihr Gebrauch durch höhere Programmiersprachen, in der Suche nach verbesserter Programmierproduktivität größtenteils verdrängt worden. Heute wird Zusammenbau-Sprache noch für die direkte Hardware-Manipulation, den Zugang zu Spezialverarbeiter-Instruktionen verwendet, oder kritische Leistungsprobleme zu richten. Typischer Gebrauch ist Gerät-Fahrer, auf niedriger Stufe eingebettete Systeme und Echtzeitsysteme.

Historisch, eine Vielzahl von Programmen sind völlig auf der Zusammenbau-Sprache geschrieben worden. Betriebssysteme wurden auf der Zusammenbau-Sprache bis zur Einführung des Burroughs MCP (1961) völlig geschrieben, der in ESPOL, einem ALGOL-Dialekt geschrieben wurde. Viele kommerzielle Anwendungen wurden auf der Zusammenbau-Sprache ebenso einschließlich eines großen Betrags der von großen Vereinigungen geschriebenen Großrechner-Software von IBM geschrieben. COBOL und FORTRAN haben schließlich viel von dieser Arbeit versetzt, obwohl mehrere große Organisationen mit dem Zusammenbau sprachige Anwendungsinfrastrukturen gut in die 90er Jahre behalten haben.

Frühste Mikrocomputer haben sich auf die handcodierte Zusammenbau-Sprache, einschließlich am meisten Betriebssysteme und großer Anwendungen verlassen. Das war, weil diese Systeme strenge Quelleneinschränkungen hatten, idiosynkratisches Gedächtnis und Anzeigearchitekturen auferlegt haben, und beschränkte, verwanzte Systemdienstleistungen zur Verfügung gestellt haben. Vielleicht wichtiger war der Mangel an erstklassigen für den Mikrocomputergebrauch passenden Bearbeitern der höheren Programmiersprache. Ein psychologischer Faktor kann auch eine Rolle gespielt haben: Die erste Generation von Mikrocomputerprogrammierern hat einen Hobbyisten, "Leitungen und Zangen" Einstellung behalten.

In einem kommerzielleren Zusammenhang waren die größten Gründe dafür, Zusammenbau-Sprache zu verwenden, minimaler bloat (Größe), minimale oberirdische, größere Geschwindigkeit und Zuverlässigkeit.

Typische Beispiele von großen Zusammenbau-Sprachprogrammen von dieser Zeit sind IBM PC DOS Betriebssysteme und frühe Anwendungen wie das Spreadsheet-Programm Lotus 1-2-3. Sogar in die 1990er Jahre wurden die meisten Konsole-Videospiele im Zusammenbau, einschließlich der meisten Spiele für die Mega Drive / Entstehung und das Nintendo Superunterhaltungssystem geschrieben. Gemäß einigen Industrieeingeweihten war die Zusammenbau-Sprache die beste Computersprache, um zu verwenden, um die beste Leistung aus dem Sega Saturn, eine Konsole zu bekommen, die notorisch schwierig war, um Spiele dafür zu entwickeln und zu programmieren. Die populäre Arkade-Spiel-NBA-Marmelade (1993) ist ein anderes Beispiel. Zusammenbau-Sprache ist lange die primäre Entwicklungssprache für viele populäre Hauscomputer der 1980er Jahre und der 1990er Jahre (wie das Spektrum von Sinclair ZX, Kommodore 64, Kommodore Amiga, und Atari ST) gewesen. Das war im großen Teil, weil GRUNDLEGENDE Dialekte auf diesen Systemen ungenügende Ausführungsgeschwindigkeit, sowie ungenügende Möglichkeiten angeboten haben, vollen Vorteil der verfügbaren Hardware auf diesen Systemen zu nehmen. Einige Systeme, am meisten namentlich der Amiga, haben sogar IDEN mit dem hoch fortgeschrittenen Beseitigen und den Makromöglichkeiten, wie der freeware ASM Ein Monteur, der mit dieser von Möglichkeiten von Microsoft Visual Studio vergleichbar ist (ASM Man datiert Microsoft Visual Studio zurück).

Der Monteur für den VIC-20 wurde von Don French geschrieben und durch Seide von French veröffentlicht. In 1639 Bytes in der Länge glaubt sein Autor, dass es der kleinste symbolische jemals schriftliche Monteur ist. Der Monteur hat das übliche symbolische Wenden und die Definition von Charakter-Schnuren oder Hexe-Schnuren unterstützt. Es hat auch Adressausdrücke erlaubt, die mit Hinzufügung, Subtraktion, Multiplikation, Abteilung, logisch UND, logisch ODER, und exponentiation Maschinenbediener verbunden werden konnten.

Aktueller Gebrauch

Es hat immer Debatten über die Nützlichkeit und Leistung der Zusammenbau-Sprache hinsichtlich höherer Programmiersprachen gegeben. Zusammenbau-Sprache hat spezifischen Nische-Nutzen, wo es wichtig ist; sieh unten. Aber im Allgemeinen, wie man fordert, machen moderne Optimierungsbearbeiter höhere Programmiersprachen in den Code, der so schnell wie handschriftlichen Zusammenbau trotz der Gegenbeispiele führen kann, die gefunden werden können. Die Kompliziertheit von modernen Verarbeitern und Speichersubsystemen macht wirksame Optimierung immer schwieriger für Bearbeiter, sowie Zusammenbau-Programmierer. Außerdem, und zur Betroffenheit von Leistungsfähigkeitsgeliebten, Verarbeitungsleistung vergrößernd, hat bedeutet, dass die meisten Zentraleinheiten müßig den größten Teil der Zeit mit Verzögerungen sitzen, die durch voraussagbare Engpässe wie Eingabe/Ausgabe-Operationen und Paginierung verursacht sind. Das hat rohe Codeausführung ein Nichtproblem für viele Programmierer beschleunigen lassen.

Es gibt einige Situationen, in denen Entwickler beschließen könnten, Zusammenbau-Sprache zu verwenden:

  • Eine eigenständige rechtskräftige von der Kompaktgröße ist erforderlich, der ohne Zuflucht zu den Laufzeitbestandteilen oder mit einer höheren Programmiersprache vereinigten Bibliotheken durchführen muss; das ist vielleicht die allgemeinste Situation. Zum Beispiel, firmware für Telefone, Kraftfahrzeugbrennstoff und Zünden-Systeme, Regelsysteme, Sicherheitssysteme und Sensoren klimatisierend.
  • Code, der direkt mit der Hardware zum Beispiel in Gerät-Fahrern aufeinander wirken und Dressierer unterbrechen muss.
  • Programme, die mit dem Verarbeiter spezifische in einem Bearbeiter nicht durchgeführte Instruktionen verwenden müssen. Ein allgemeines Beispiel ist die bitwise Folge-Instruktion am Kern von vielen Verschlüsselungsalgorithmen.
  • Programme, die Vectorized-Funktionen für Programme auf Sprachen des höheren Niveaus wie C schaffen. Auf der Sprache des höheren Niveaus wird dem manchmal durch den Bearbeiter innere Funktionen geholfen, die direkt zur SIMD Gedächtniskunst kartografisch darstellen, aber dennoch auf eine isomorphe für den gegebenen Vektor-Verarbeiter spezifische Zusammenbau-Konvertierung hinauslaufen.
  • Programme, die äußerste Optimierung, zum Beispiel eine innere Schleife in einem mit dem Verarbeiter intensiven Algorithmus verlangen. Spielprogrammierer nutzen die geistigen Anlagen von Hardware-Eigenschaften in Systemen aus, Spielen ermöglichend, schneller zu laufen. Auch große wissenschaftliche Simulationen verlangen hoch optimierte Algorithmen, z.B geradlinige Algebra mit BLAS oder getrennter Kosinus-Transformation (z.B. SIMD Zusammenbau-Version von x264)
  • Situationen, wo keine höhere Programmiersprache auf einem neuen oder spezialisierten Verarbeiter zum Beispiel besteht.
  • Programme brauchen genaues Timing wie
  • Echtzeitprogramme wie Simulationen, Flugnavigationssysteme und medizinische Ausrüstung. Zum Beispiel, in einem System der Fliege durch die Leitung, muss Telemetrie interpretiert und innerhalb von strengen zeitlichen Einschränkungen gehandelt werden. Solche Systeme müssen Quellen von unvorhersehbaren Verzögerungen beseitigen, die durch (einen) interpretierte Sprachen, automatische Müll-Sammlung, Paginierungsoperationen oder präemptive Multitasking geschaffen werden können. Jedoch vereinigen einige Sprachen des höheren Niveaus Laufzeitbestandteile und Betriebssystemschnittstellen, die solche Verzögerungen einführen können. Die Auswahl des Zusammenbaues oder der Sprachen der niedrigeren Ebene für solche Systeme gibt Programmierern größere Sichtbarkeit und Kontrolle über in einer Prozession gehende Details.
  • kryptografische Algorithmen, die immer ausschließlich dieselbe Zeit nehmen müssen, um durchzuführen, zeitlich festlegende Angriffe verhindernd.
  • Situationen, wo die ganze Kontrolle über die Umgebung in äußerst hohen Sicherheitssituationen erforderlich ist, wo nichts als selbstverständlich betrachtet werden kann.
  • Computerviren, bootloaders, bestimmte Gerät-Fahrer oder andere Sachen sehr in der Nähe von der Hardware oder dem auf niedriger Stufe Betriebssystem.
  • Befehlssatz-Simulatoren für die Überwachung, die Nachforschung und das Beseitigen, wo zusätzlich, oben werden zu einem Minimum behalten
  • Rücktechnik und Ändern-Programm-Dateien wie
  • vorhandene Dualzahlen, die können oder auf einer höheren Programmiersprache zum Beispiel nicht ursprünglich geschrieben worden sein dürfen, wenn sie versuchen, Programme zu erfrischen, wegen deren Quellcode nicht verfügbar ist oder verloren worden ist, oder Kopie-Schutz der Eigentumssoftware knackend.
  • Videospiele (auch das genannte ROM-Hacken), der über mehrere Methoden möglich ist. Am weitesten verwendet verändert Programm-Code an der Zusammenbau-Sprachebene.
  • Selbst, Code modifizierend, zu dem Zusammenbau-Sprache sich gut leiht.
  • Spiele und andere Software, um Rechenmaschinen grafisch darzustellen.

Zusammenbau-Sprache wird noch im grössten Teil der Informatik und elektronischen Technikprogrammen unterrichtet. Obwohl wenige Programmierer heute regelmäßig mit der Zusammenbau-Sprache als ein Werkzeug arbeiten, bleiben die zu Grunde liegenden Konzepte sehr wichtig. Solche grundsätzlichen Themen als binäre Arithmetik, Speicherzuteilung, Stapel-Verarbeitung, Codierungsverschlüsselung, Unterbrechungsverarbeitung und Bearbeiter-Design würden hart sein, im Detail ohne einen Griff dessen zu studieren, wie ein Computer am Hardware-Niveau funktioniert. Da ein Verhalten eines Computers durch seinen Befehlssatz, die logische Weise im Wesentlichen definiert wird zu erfahren, dass solche Konzepte sind, eine Zusammenbau-Sprache zu studieren. Die meisten modernen Computer haben ähnliche Befehlssätze. Deshalb ist das Studieren einer einzelnen Zusammenbau-Sprache genügend, um zu erfahren: I) die grundlegenden Konzepte; II), um Situationen anzuerkennen, wo der Gebrauch der Zusammenbau-Sprache passend sein könnte; und III), um zu sehen, wie effizienter rechtskräftiger Code aus höheren Programmiersprachen geschaffen werden kann.

Das ist Kindern analog, die die grundlegenden arithmetischen Operationen erfahren müssen (z.B, lange Abteilung), obwohl Rechenmaschinen für alle außer den meisten trivialen Berechnungen weit verwendet werden.

Typische Anwendungen

  • Zusammenbau-Sprache wird normalerweise in einem Stiefelcode eines Systems verwendet, (BIOS auf IBM-kompatiblen PC-Systemen und BEDIENUNGSFELD/M), der auf niedriger Stufe Code, der initialisiert und die Systemhardware vor dem Starten des OS prüft, und wird häufig im ROM versorgt.
  • Einige Bearbeiter übersetzen höhere Programmiersprachen in den Zusammenbau zuerst vor völlig dem Kompilieren, dem Zusammenbau-Code erlaubend, zu Beseitigen- und Optimierungszwecken angesehen zu werden.
  • Relativ auf niedriger Stufe Sprachen, wie C, erlauben dem Programmierer, Zusammenbau-Sprache direkt im Quellcode einzubetten. Programme mit solchen Möglichkeiten, wie der Kern von Linux, können dann Abstraktionen mit der verschiedenen Zusammenbau-Sprache auf jeder Hardware-Plattform bauen. Der tragbare Code des Systems kann dann diese mit dem Verarbeiter spezifischen Bestandteile durch eine gleichförmige Schnittstelle verwenden.
  • Zusammenbau-Sprache ist in der Rücktechnik wertvoll. Viele Programme werden nur in der Maschinencodeform verteilt, die aufrichtig ist, um in die Zusammenbau-Sprache, aber schwieriger zu übersetzen, in eine Sprache des höheren Niveaus zu übersetzen. Werkzeuge wie der Interaktive Zurückübersetzer machen umfassenden Gebrauch der Zerlegung zu solch einem Zweck.
  • Monteure können verwendet werden, um Datenblocks ohne höhere Programmiersprache oben vom formatierten zu erzeugen, und haben Quellcode kommentiert, um durch anderen Code verwendet zu werden.

Zusammenhängende Fachsprache

  • Zusammenbau-Sprache oder Assembler werden Zusammenbau, Monteur, ASM oder symbolischen Maschinencode allgemein genannt. Eine Generation von Großrechner-Programmierern von IBM hat es ALC nach dem Zusammenbau-Sprachcode oder BAL für die Grundlegende Zusammenbau-Sprache genannt. Das Benennen des Sprachmonteurs könnte potenziell verwirrend und zweideutig betrachtet werden, da das auch der Name des Dienstprogramms ist, das Zusammenbau-Sprachbehauptungen in den Maschinencode übersetzt. Jedoch ist dieser Gebrauch unter Fachleuten und in der Literatur seit Jahrzehnten üblich gewesen. Ähnlich haben einige frühe Computer ihren Monteur ihr Zusammenbau-Programm genannt.)
  • Der rechenbetonte Schritt, wohin ein Monteur einschließlich der ganzen Makroverarbeitung geführt wird, ist genannte Montagezeit.
  • Der Gebrauch der Wortzusammenbau-Daten von den frühen Jahren von Computern (vgl kurzer Code, speedcode).
  • Ein böser Monteur (sieh bösen Bearbeiter), ist ein Monteur, der auf einem Computer oder Betriebssystem eines verschiedenen Typs vom System geführt wird, auf dem der resultierende Code laufen soll. Quer-Versammlung kann notwendig sein, wenn das Zielsystem keinen Monteur selbst führen kann, wie normalerweise der Fall für kleine eingebettete Systeme ist. Ein böser Monteur muss zur Verfügung stellen oder zu Möglichkeiten verbinden, den Code zum Zielverarbeiter zu transportieren. Es erzeugt gewöhnlich ein binäres Image, oder Datei von Intel HEX aber nicht eine Gegenstand-Datei.
  • Eine Assemblerdirektive oder pseudo-opcode sind ein Befehl, der einem Monteur "Richtung davon gegeben ist, um Operationen durchzuführen, außer sich versammelnden Instruktionen." Direktiven betreffen, wie der Monteur funktioniert und "den Gegenstand-Code, die Symbol-Tabelle, die Schlagseite habende Datei und die Werte innerer Assemblerrahmen betreffen kann." Manchmal wird der Begriff pseudo-opcode für Direktiven vorbestellt, die Gegenstand-Code, wie diejenigen erzeugen, die Daten erzeugen.
  • Ein Meta-Monteur ist "ein Programm, das die syntaktische und semantische Beschreibung einer Zusammenbau-Sprache akzeptiert, und einen Monteur für diese Sprache erzeugt."

Liste von Monteuren für verschiedene Computerarchitekturen

Die folgende Seite hat eine Liste von verschiedenen Monteuren für die verschiedenen Computerarchitekturen zusammen mit jeder verbundenen Information für diesen spezifischen Monteur:

  • Liste von Monteuren

Weitere Details

Für jeden gegebenen Personalcomputer, Großrechner, hat System, und Spielkonsole, beide Vergangenheit und Gegenwart, mindestens einen - vielleicht eingebettet Dutzende - Monteure sind geschrieben worden. Für einige Beispiele, sieh die Liste von Monteuren.

Auf Unix Systemen wird der Monteur als traditionell genannt, obwohl es kein einziger Körper des Codes ist, von neuem für jeden Hafen normalerweise geschrieben. Mehrere Unix Varianten verwenden BENZIN.

Innerhalb von Verarbeiter-Gruppen hat jeder Monteur seinen eigenen Dialekt. Manchmal können einige Monteure den Dialekt eines anderen Monteurs zum Beispiel lesen, TASM kann alten MASM-Code, aber nicht die Rückseite lesen. FASM und NASM haben ähnliche Syntax, aber jede Unterstützung verschiedene Makros, die sie schwierig machen konnten, zu einander zu übersetzen. Die Grundlagen sind alle gleich, aber die fortgeschrittenen Eigenschaften werden sich unterscheiden.

Außerdem kann Zusammenbau manchmal über verschiedene Betriebssysteme auf demselben Typ der Zentraleinheit tragbar sein. Die Benennen-Vereinbarung zwischen Betriebssystemen unterscheidet sich häufig ein bisschen oder überhaupt nicht, und mit der Sorge ist es möglich, etwas Beweglichkeit auf der Zusammenbau-Sprache gewöhnlich durch die Verbindung mit einer C Bibliothek zu gewinnen, die sich zwischen Betriebssystemen nicht ändert. Ein Befehlssatz-Simulator kann den Gegenstand-Code / binär jedes Monteurs bearbeiten, um Beweglichkeit sogar über Plattformen mit einem oberirdischen zu erreichen, der nicht größer ist als ein typischer bytecode Dolmetscher. Das ist dem Gebrauch des Mikrocodes ähnlich, um Vereinbarkeit über eine Verarbeiter-Familie zu erreichen.

Einige höhere Niveau-Computersprachen, wie C und Borland Pascal, unterstützen Reihenzusammenbau, wo Abteilungen des Zusammenbau-Codes, in der Praxis gewöhnlich Schriftsatz, in den hohen Sprachcode eingebettet werden können. Hervor enthält Sprache allgemein einen in CODE-Wörtern verwendeten Monteur.

Ein Emulator kann verwendet werden, um bei mit dem Zusammenbau sprachigen Programmen die Fehler zu beseitigen.

Beispiel-Auflistung des Zusammenbau-Sprachquellcodes

Beispiel einer Auswahl an Instruktionen (für einen virtuellen Computer) mit dem

die entsprechende Adresse im Gedächtnis, wohin jede Instruktion gelegt wird. Diese Adressen sind nicht statisch, sehen Speichermanagement.

Das Begleiten jeder Instruktion ist das erzeugte (durch den Monteur) Gegenstand-Code, der mit der Architektur des virtuellen Computers (oder ISA) zusammenfällt.

Siehe auch

Weiterführende Literatur

  • ASM Gemeinschaftsbuch "Ein Online-Buch, das mit dem nützlichen ASM Info, den Tutorenkursen und den Codebeispielen" durch die ASM Gemeinschaft voll
ist
  • Jonathan Bartlett: Programmierung vom Boden. Bartlett, der, 2004 Veröffentlicht. Internationale Standardbuchnummer 0 9752838 4 7Also verfügbare online als PDF
  • Robert Britton: MIPS Zusammenbau-Sprachprogrammierung. Prentice Hall, 2003. Internationale Standardbuchnummer 0-13-142044-5
  • Paul Carter: PC-Zusammenbau-Sprache. Freier ebook, 2001. Website
  • Jeff Duntemann: Schrittweise Zusammenbau-Sprache. Wiley, 2000. Internationale Standardbuchnummer 0-471-37523-3
  • Randall Hyde: Die Kunst der Zusammenbau-Sprache. Keine Stärke-Presse, 2003. Internationale Standardbuchnummer 1 886411 97 2Draft Versionen verfügbar online als PDF und HTML
  • Peter Norton, John Socha, das Zusammenbau-Sprachbuch von Peter Norton für IBM PC, Bücher von Brady, New York: 1986.
  • Michael Singer, PDP-11. Assembler-Programmierung und Maschinenorganisation, John Wiley & Sons, New York: 1980.
  • Dominic Sweetman: Sieh MIPS-Lauf. Herausgeber von Morgan Kaufmann, 1999. Internationale Standardbuchnummer 1-55860-410-3
  • John Waldron: Einführung in die RISC Zusammenbau-Sprachprogrammierung. Addison Wesley, 1998. Internationale Standardbuchnummer 0-201-39828-1

Links


Albertosaurus / Ambrosia
Impressum & Datenschutz