DIE KLINGEL

Es gibt diejenigen, die diese Nachrichten vor Ihnen lesen.
Abonnieren Sie, um die neuesten Artikel zu erhalten.
Email
Name
Nachname
Wie willst du The Bell lesen?
Kein Spam

Thema 1.4 Assembler-Mnemonik. Struktur und Formate von Befehlen. Arten der Adressierung. Mikroprozessor-Befehlssatz

Planen:

1 Assemblersprache. Grundlegendes Konzept

2 Assemblersprachensymbole

3 Arten von Assembler-Anweisungen

4 Versammlungsanweisungen

5 Prozessorbefehlssatz

1 iassemblersprache. Grundlegendes Konzept

Assemblersprache ist eine symbolische Darstellung der Maschinensprache. Alle Prozesse in der Maschine auf der niedrigsten Hardwareebene werden nur durch maschinensprachliche Befehle (Anweisungen) gesteuert. Daher ist es klar, dass trotz des allgemeinen Namens die Assemblersprache für jeden Computertyp unterschiedlich ist.

Ein Assembler-Programm ist eine Sammlung von Speicherblöcken, die aufgerufen werden speichersegmente.Ein Programm kann aus einem oder mehreren solchen Blocksegmenten bestehen. Jedes Segment enthält eine Reihe von Sprachsätzen, von denen jeder eine separate Zeile Programmcode belegt.

Es gibt vier Arten von Versammlungssätzen:

1) befehle oder Anweisungen, das sind symbolische Analoga von Maschinenanweisungen. Während des Übersetzungsprozesses werden die Assembler-Befehle in die entsprechenden Befehle des Mikroprozessor-Befehlssatzes umgewandelt;

2) makros -auf bestimmte Weise gebildete Sätze des Programmtextes, die während der Sendung durch andere Sätze ersetzt werden;

3) richtlinien,dies sind Anweisungen an den Assembler-Übersetzer, um einige Aktionen auszuführen. Richtlinien haben kein Analogon in der Maschinendarstellung;

4) kommentarzeilen enthält alle Symbole, einschließlich der Buchstaben des russischen Alphabets. Kommentare werden vom Übersetzer ignoriert.

­ Die Struktur eines Montageprogramms. Assembly-Syntax.

Die Sätze, aus denen ein Programm besteht, können ein syntaktisches Konstrukt sein, das einem Befehl, einem Makro, einer Direktive oder einem Kommentar entspricht. Damit der Assembler-Übersetzer sie erkennen kann, müssen sie nach bestimmten syntaktischen Regeln gebildet werden. Der beste Weg, dies zu tun, besteht darin, eine formale Beschreibung der Syntax der Sprache zu verwenden, wie z. B. Grammatikregeln. Die gebräuchlichste Art, eine Programmiersprache wie diese zu beschreiben - Syntaxdiagramme und erweiterte Backus-Naur-Formen. Bequemer für den praktischen Gebrauch syntaxdiagramme.Zum Beispiel kann die Syntax von Assembler-Sätzen unter Verwendung der in den folgenden Abbildungen 10, 11, 12 gezeigten Syntaxdiagramme beschrieben werden.

Abbildung 10 - Format eines Assembler-Satzes


­ Abbildung 11 - Format der Anweisungen

­ Abbildung 12 - Format von Befehlen und Makros

In diesen Figuren:

­ markenname - eine Kennung, deren Wert die Adresse des ersten Bytes des Satzes des von ihm bezeichneten Programmquelltextes ist;

­ name - Kennung, die diese Direktive von anderen gleichnamigen Direktiven unterscheidet. Durch die Verarbeitung einer bestimmten Direktive durch den Assembler können diesem Namen bestimmte Merkmale zugewiesen werden.

­ opcode (COP) und Direktive - es handelt sich um mnemonische Bezeichnungen der entsprechenden Maschinenanweisung, Makro- oder Übersetzeranweisung;

­ operanden - Teile einer Befehls-, Makro- oder Assembler-Direktive, die zu manipulierende Objekte festlegen. Assembler-Operanden werden durch Ausdrücke mit numerischen und Textkonstanten, Beschriftungen und Variablenbezeichnern unter Verwendung von Operationszeichen und einigen reservierten Wörtern beschrieben.

Syntaxdiagramme helfen suchen Sie und gehen Sie dann vom Eingang des Diagramms (links) zum Ausgang (rechts). Wenn ein solcher Pfad existiert, ist der Satz oder die Konstruktion syntaktisch korrekt. Wenn es keinen solchen Pfad gibt, akzeptiert der Compiler diese Konstruktion nicht.

­ 2 Assemblersprachensymbole

Die zulässigen Zeichen beim Schreiben von Programmtext sind:

1) alle lateinischen Buchstaben: A-Z, a-z... In diesem Fall werden Groß- und Kleinbuchstaben als gleichwertig betrachtet.

2) Zahlen von 0 Vor 9 ;

3) Zeichen ? , @ , $ , _ , & ;

4) Separatoren , . () < > { } + / * % ! " " ? = # ^ .

Assembler-Sätze werden aus gebildet tokenDies sind syntaktisch untrennbare Sequenzen gültiger Sprachzeichen, die für einen Übersetzer sinnvoll sind.

Lexeme sind:

1) Kennungen - Sequenzen gültiger Zeichen zur Bezeichnung von Programmobjekten wie Opcodes, Variablennamen und Beschriftungsnamen. Die Regel zum Schreiben von Bezeichnern lautet wie folgt: Ein Bezeichner kann aus einem oder mehreren Zeichen bestehen.

2) zeichenketten - Zeichenfolgen in einfachen oder doppelten Anführungszeichen;

3) ganze Zahlen eines der folgenden Zahlensysteme : binär, dezimal, hexadezimal. Die Identifizierung von Nummern beim Schreiben in Assembler-Programmen erfolgt nach bestimmten Regeln:

4) Dezimalzahlen erfordern keine zusätzlichen Symbole für ihre Identifizierung, zum Beispiel 25 oder 139. Zur Identifizierung im Quellcode des Programms binärzahlen es ist notwendig, nach dem Schreiben der Nullen und Einsen, aus denen sie bestehen, das Latein zu setzen “ b”, Zum Beispiel 10010101 b.

5) hexadezimalzahlen haben mehr Konventionen, wenn sie geschrieben werden:

Erstens bestehen sie aus Zahlen 0...9 , Klein- und Großbuchstaben des lateinischen Alphabets ein, b, c, d, e, f oder EIN, B., C., D., E., F..

Zweitens kann der Übersetzer Schwierigkeiten haben, Hexadezimalzahlen zu erkennen, da sie entweder nur aus den Ziffern 0 ... 9 (z. B. 190845) bestehen oder mit einem Buchstaben des lateinischen Alphabets (z. B. 190845) beginnen können ef15). Um dem Übersetzer zu "erklären", dass ein gegebenes Token keine Dezimalzahl oder Kennung ist, muss der Programmierer auf besondere Weise eine Hexadezimalzahl auswählen. Schreiben Sie dazu am Ende der Folge von Hexadezimalziffern, aus denen eine Hexadezimalzahl besteht, den lateinischen Buchstaben „ h”. Dies ist Voraussetzung. Wenn eine Hexadezimalzahl mit einem Buchstaben beginnt, wird eine führende Null davor geschrieben: 0 ef15 h.

Fast jeder Satz enthält eine Beschreibung des Objekts, an dem oder mit dessen Hilfe eine Aktion ausgeführt wird. Diese Objekte werden aufgerufen operanden... Sie können folgendermaßen definiert werden: operanden - Dies sind Objekte (einige Werte, Register oder Speicherzellen), auf die Anweisungen oder Anweisungen einwirken, oder Objekte, die die Wirkung von Anweisungen oder Anweisungen definieren oder klarstellen.

Es ist möglich, folgende Klassifikationen von Operanden durchzuführen:

­ konstante oder unmittelbare Operanden;

­ adressoperanden;

­ bewegliche Operanden;

Adresszähler;

­ registeroperand;

­ basis- und Indexoperanden;

­ strukturelle Operanden;

Aufzeichnungen.

Operanden sind elementare Komponenten, die Teil eines Maschinenbefehls sind, der die Objekte bezeichnet, an denen eine Operation ausgeführt wird. In einem allgemeineren Fall können Operanden als Bestandteile in komplexeren Formationen enthalten sein, die als bezeichnet werden ausdrücke.

Ausdrücke sind Kombinationen von Operanden und Operatoren, die als Ganzes betrachtet werden. Das Ergebnis der Auswertung eines Ausdrucks kann eine Adresse einer bestimmten Speicherzelle oder ein konstanter (absoluter) Wert sein.

­ 3 Arten von Assembler-Anweisungen

Lassen Sie uns die möglichen Typen auflisten assembler-Operatoren und syntaktische Regeln für die Bildung von Assembler-Ausdrücken:

­ rechenzeichen;

­ schichtarbeiter;

­ vergleichsoperatoren;

­ logische Operatoren;

­ indexoperator;

­ typ-Override-Operator;

­ segmentüberschreibungsoperator;

­ benennungsoperator für Strukturtypen;

­ operator zum Erhalten der Segmentkomponente der Ausdrucksadresse;

­ operator, um den Offset eines Ausdrucks abzurufen.

1 Assembler-Anweisungen

­ Assembler-Anweisungen sind:

1) Segmentierungsrichtlinien. Im Verlauf der vorherigen Diskussion haben wir alle Grundregeln für das Schreiben von Befehlen und Operanden in einem Assembly-Programm herausgefunden. Die Frage, wie die Befehlsfolge richtig formuliert werden kann, damit der Übersetzer sie verarbeiten und der Mikroprozessor sie ausführen kann, bleibt offen.

Bei der Betrachtung der Architektur des Mikroprozessors haben wir festgestellt, dass er sechs Segmentregister hat, über die er gleichzeitig arbeiten kann:

­ mit einem Codesegment;

­ mit einem Stapelsegment;

­ mit einem Datensegment;

­ mit drei zusätzlichen Datensegmenten.

Physikalisch ist ein Segment ein Speicherbereich, der von Befehlen und (oder) Daten belegt ist, deren Adressen relativ zum Wert im entsprechenden Segmentregister berechnet werden. Die syntaktische Beschreibung des Segments im Assembler entspricht der in Abbildung 13 gezeigten Konstruktion:


­ Abbildung 13 - Syntaktische Beschreibung des Segments im Assembler

Es ist wichtig zu beachten, dass die Funktionalität eines Segments etwas breiter ist als das einfache Aufteilen eines Programms in Code-, Daten- und Stapelblöcke. Die Segmentierung ist Teil eines allgemeineren Mechanismus in Bezug auf das Konzept der modularen Programmierung. Es beinhaltet die Vereinheitlichung des Entwurfs von Objektmodulen, die vom Compiler erstellt wurden, einschließlich solcher aus verschiedenen Programmiersprachen. Auf diese Weise können Sie Programme kombinieren, die in verschiedenen Sprachen geschrieben sind. Die Operanden in der SEGMENT-Richtlinie sollen verschiedene Varianten einer solchen Union implementieren.

2) Listing Management Direktiven. Listing Control Direktiven sind in folgende Gruppen unterteilt:

­ allgemeine Richtlinien zur Kotierungskontrolle;

­ ausgabeanweisungen zur Auflistung der enthaltenen Dateien;

­ anweisungen zur Ausgabe von bedingten Baugruppenblöcken;

­ anweisungen zum Auflisten von Makros;

­ anweisungen zur Ausgabe von Informationen über Querverweise auf die Auflistung;

­ anweisungen zum Ändern des Listenformats.

2 Prozessorbefehlssatz

Der Prozessorbefehlssatz ist in Abbildung 14 dargestellt.

Betrachten wir die Hauptgruppen von Befehlen.

­ Abbildung 14 - Klassifizierung der Assembler-Anweisungen

Die Teams sind:

1 Datenübertragungsbefehle. Diese Befehle sind im Befehlssatz eines jeden Prozessors sehr wichtig. Sie erfüllen folgende wesentliche Funktionen:

­ speichern des Inhalts interner Prozessorregister im Speicher;

­ kopieren von Inhalten von einem Speicherbereich in einen anderen;

­ schreiben auf E / A-Geräte und Lesen von E / A-Geräten.

Auf einigen Prozessoren werden alle diese Funktionen von einem einzigen Befehl ausgeführtMOV (für Byte-Übertragungen -MOVB ) aber mit verschiedenen Methoden zur Adressierung der Operanden.

Auf anderen Prozessoren neben dem BefehlMOV Es gibt mehrere weitere Befehle, um die aufgelisteten Funktionen auszuführen. Datenübertragungsbefehle enthalten auch Informationsaustauschbefehle (ihre Bezeichnung basiert auf dem WortAustausch ). Der Informationsaustausch zwischen internen Registern, zwischen zwei Hälften eines Registers (TAUSCHEN ) oder zwischen einem Register und einem Speicherort.

2 Rechenbefehle. Arithmetische Anweisungen behandeln Operandencodes als numerische Binär- oder BCD-Codes. Diese Befehle können in fünf Hauptgruppen unterteilt werden:

­ festkommaoperationsbefehle (Addition, Subtraktion, Multiplikation, Division);

­ gleitkommabefehle (Addition, Subtraktion, Multiplikation, Division);

­ reinigungsbefehle;

­ inkrementierungs- und Dekrementierungsbefehle;

­ vergleichsbefehl.

3 Befehle von Operationen mit einem festen Punkt bearbeiten Codes in den Prozessorregistern oder im Speicher wie bei üblichen Binärcodes. Gleitkommaanweisungen verwenden das Format der Darstellung von Zahlen mit Reihenfolge und Mantisse (normalerweise belegen diese Zahlen zwei aufeinanderfolgende Speicherplätze). In modernen leistungsstarken Prozessoren ist der Satz von Gleitkommaanweisungen nicht nur auf vier arithmetische Operationen beschränkt, sondern enthält viele andere komplexere Anweisungen, beispielsweise die Berechnung trigonometrischer Funktionen, logarithmischer Funktionen sowie komplexer Funktionen, die für die Verarbeitung von Ton und Bild erforderlich sind.

4 Löschanweisungen dienen zum Schreiben eines Nullcodes in ein Register oder eine Speicherzelle. Diese Befehle können mit Nullübertragungsbefehlen überschrieben werden, aber spezielle Löschbefehle sind normalerweise schneller als Übertragungsbefehle.

5 Befehle zum Inkrementieren (Erhöhen um eins) und Dekrementieren

(Dekremente um eins) sind auch sehr praktisch. Sie können im Prinzip durch die Addition durch einen oder einen Subtraktionsbefehl ersetzt werden, aber das Inkrementieren und Dekrementieren ist schneller als das Addieren und Subtrahieren. Diese Anweisungen erfordern einen Eingabeoperanden, der auch ein Ausgabeoperand ist.

6 Der Vergleichsbefehl vergleicht zwei Eingangsoperanden. Tatsächlich berechnet es die Differenz zwischen diesen beiden Operanden, bildet jedoch keinen Ausgabeoperanden, sondern ändert nur die Bits im Prozessorstatusregister durch das Ergebnis dieser Subtraktion. Der nächste Befehl nach dem Vergleichsbefehl (normalerweise ein Verzweigungsbefehl) analysiert die Bits im Prozessorstatusregister und führt abhängig von ihren Werten Aktionen aus. Einige Prozessoren bieten Anweisungen zum Verketten von zwei Sequenzen von Operanden im Speicher.

7 Logische Befehle. Logische Anweisungen führen logische (bitweise) Operationen an Operanden aus, dh sie betrachten die Operandencodes nicht als eine einzelne Zahl, sondern als einen Satz separater Bits. So unterscheiden sie sich von arithmetischen Befehlen. Logikbefehle führen die folgenden grundlegenden Operationen aus:

­ logisches UND, logisches ODER, Additionsmodulo 2 (exklusives ODER);

­ logische, arithmetische und zyklische Verschiebungen;

­ bits und Operanden prüfen;

­ setzen und Löschen von Bits (Flags) des Prozessorstatusregisters (PSW).

Mit Logikanweisungen können Sie grundlegende Logikfunktionen aus zwei Eingangsoperanden Stück für Stück berechnen. Zusätzlich wird die UND-Operation verwendet, um die angegebenen Bits zwangsweise zu löschen (als einer der Operanden wird ein Maskencode verwendet, in dem die zu löschenden Bits auf Null gesetzt werden). Die ODER-Operation wird verwendet, um die angegebenen Bits zwangsweise zu setzen (als einer der Operanden wird ein Maskencode verwendet, bei dem die Bits, die auf eins gesetzt werden müssen, gleich eins sind). Die Operation "Exklusives ODER" wird verwendet, um die angegebenen Bits zu invertieren (ein Maskencode wird als einer der Operanden verwendet, in denen die zu invertierenden Bits auf eins gesetzt werden). Die Anweisungen erfordern zwei Eingabeoperanden und bilden einen Ausgabeoperanden.

8 Mit Shift-Befehlen kann der Operandencode Stück für Stück nach rechts (in Richtung der niederwertigen Bits) oder links (in Richtung der höherwertigen Bits) verschoben werden. Der Verschiebungstyp (logisch, arithmetisch oder zyklisch) bestimmt, wie der neue Wert des höchstwertigen Bits (beim Verschieben nach rechts) oder des niedrigstwertigen Bits (beim Verschieben nach links) sein wird, und bestimmt auch, ob der vorherige Wert des höchstwertigen Bits (beim Verschieben nach links) irgendwo gespeichert wird oder das niedrigstwertige Bit (wenn nach rechts verschoben). Durch zyklische Verschiebungen können die Bits eines Operanden kreisförmig verschoben werden (im Uhrzeigersinn bei Verschiebung nach rechts oder gegen den Uhrzeigersinn bei Verschiebung nach links). In diesem Fall kann das Übertragsflag in dem Schaltring enthalten sein oder nicht. Das Übertragsflag-Bit (falls verwendet) speichert den Wert des höchstwertigen Bits beim Linkslauf und des niedrigstwertigen Bits beim Rechtslauf. Dementsprechend wird der Wert des Übertragsflag-Bits beim Radfahren nach links im niedrigstwertigen Bit und beim Radfahren nach rechts im höchstwertigen Bit überschrieben.

9 Befehle für Übergänge. Sprunganweisungen dienen zum Organisieren aller Arten von Schleifen, Verzweigungen, Unterprogrammaufrufen usw., dh sie stören den sequentiellen Ablauf des Programms. Diese Befehle schreiben einen neuen Wert in das Befehlszählerregister und veranlassen den Prozessor, nicht zum nächsten Befehl in der angegebenen Reihenfolge zu springen, sondern zu einem anderen Befehl im Programmspeicher. Einige Übergangsbefehle bieten eine weitere Rückkehr zu dem Punkt, von dem aus der Übergang durchgeführt wurde, andere sehen dies nicht vor. Wenn eine Rückgabe bereitgestellt wird, werden die aktuellen Prozessorparameter auf dem Stapel gespeichert. Wenn keine Rückgabe erfolgt, werden die aktuellen Prozessorparameter nicht gespeichert.

Übergangsbefehle ohne Rückverfolgung werden in zwei Gruppen unterteilt:

­ bedingungslose Sprungbefehle;

­ bedingte Sprungbefehle.

Diese Befehle verwenden die WörterZweig (Zweig) und Sprung (Sprung).

Unbedingte Sprunganweisungen bewirken unabhängig von irgendetwas einen Sprung zu einer neuen Adresse. Sie können einen Sprung um einen bestimmten Versatz (vorwärts oder rückwärts) oder zu einer bestimmten Speicheradresse verursachen. Der Offsetwert oder der neue Adresswert wird als Eingabeoperand angegeben.

Bedingte Sprungbefehle verursachen nicht immer einen Sprung, sondern nur, wenn die angegebenen Bedingungen erfüllt sind. Diese Bedingungen sind normalerweise die Werte von Flags im Prozessorstatusregister (PSW ). Das heißt, die Übergangsbedingung ist das Ergebnis der vorherigen Operation, die die Flagwerte ändert. Insgesamt kann es 4 bis 16 solcher Sprungbedingungen geben. Mehrere Beispiele für bedingte Sprungbefehle:

­ Übergang, wenn gleich Null;

­ Übergang, wenn nicht gleich Null;

­ springen, wenn es einen Überlauf gibt;

­ springen, wenn es keinen Überlauf gibt;

­ Übergang, wenn größer als Null;

­ springen, wenn kleiner oder gleich Null.

Wenn die Übergangsbedingung erfüllt ist, wird der neue Wert in das Befehlsregister geladen. Wenn die Sprungbedingung nicht erfüllt ist, wird der Befehlszähler einfach inkrementiert und der Prozessor wählt den nächsten Befehl der Reihe nach aus und führt ihn aus.

Der Vergleichsbefehl (CMP), der dem bedingten Sprungbefehl (oder sogar mehreren bedingten Sprungbefehlen) vorausgeht, wird speziell zum Überprüfen der Sprungbedingungen verwendet. Flags können jedoch mit jedem anderen Befehl gesetzt werden, z. B. einem Datenübertragungsbefehl, einem beliebigen arithmetischen oder logischen Befehl. Beachten Sie, dass die Sprungbefehle selbst die Flags nicht ändern, sodass Sie nur mehrere Sprungbefehle nacheinander eingeben können.

Interrupt-Befehle nehmen unter den Rücksprungbefehlen einen besonderen Platz ein. Diese Anweisungen erfordern eine Interruptnummer (Vektoradresse) als Eingabeoperand.

Ausgabe:

Assemblersprache ist eine symbolische Darstellung einer Maschinensprache. Die Assemblersprache für jeden Computertyp ist unterschiedlich. Ein Assembler-Programm ist eine Sammlung von Speicherblöcken, die als Speichersegmente bezeichnet werden. Jedes Segment enthält eine Reihe von Sprachsätzen, von denen jeder eine separate Zeile Programmcode belegt. Es gibt vier Arten von Assemblierungssätzen: Befehle oder Anweisungen, Makros, Anweisungen, Kommentarzeilen.

Alle lateinischen Buchstaben sind gültige Zeichen beim Schreiben von Programmtext: A-Z, a-z... In diesem Fall werden Groß- und Kleinbuchstaben als gleichwertig betrachtet. Zahlen aus 0 Vor 9 ;; Zeichen ? , @ , $ , _ , & ;; Trennzeichen , . () < > { } + / * % ! " " ? = # ^ .

Es gelten die folgenden Arten von Assembler-Anweisungen und syntaktischen Regeln zum Generieren von Assembler-Ausdrücken. arithmetische Operatoren, Verschiebungsoperatoren, Vergleichsoperatoren, logische Operatoren, Indexoperatoren, Typüberschreibungsoperatoren, Segmentüberschreibungsoperatoren, Strukturtypbenennungsoperatoren, Operatoren zum Abrufen der Segmentkomponente einer Ausdrucksadresse, Operatoren zum Abrufen des Offsets eines Ausdrucks.

Das Befehlssystem ist in 8 Hauptgruppen unterteilt.

­ Kontrollfragen:

1 Was ist Assemblersprache?

2 Mit welchen Symbolen können Befehle in Assemblersprache geschrieben werden?

3 Was sind Etiketten und deren Zweck?

4 Erläutern Sie die Struktur von Assembler-Befehlen.

5 Listen Sie 4 Arten von Assembler-Sätzen auf.

Assembler-Strukturen

Die Arrays, die wir oben betrachtet haben, sind eine Sammlung von Elementen des gleichen Typs. In Anwendungen wird es jedoch häufig erforderlich, eine bestimmte Sammlung von Daten unterschiedlicher Typen als einen bestimmten Einzeltyp zu betrachten.

Dies ist beispielsweise für Datenbankprogramme sehr wichtig, bei denen es erforderlich ist, einem Objekt eine Sammlung von Daten unterschiedlichen Typs zuzuordnen.

Zum Beispiel haben wir uns zuvor Listing 4 angesehen, das mit einem Array von Drei-Byte-Elementen funktioniert hat. Jedes Element stellte wiederum zwei Elemente unterschiedlichen Typs dar: ein Ein-Byte-Zählerfeld und ein Zwei-Byte-Feld, die einige andere Informationen enthalten könnten, die für die Speicherung und Verarbeitung erforderlich sind. Wenn der Leser mit einer der Hochsprachen vertraut ist, weiß er, dass ein solches Objekt normalerweise mit einem speziellen Datentyp beschrieben wird - strukturen.

Um die Benutzerfreundlichkeit der Assemblersprache zu verbessern, wurde auch dieser Datentyp eingeführt.

Per Definition struktur ist ein Datentyp, der aus einer festen Anzahl von Elementen unterschiedlicher Typen besteht.

Um Strukturen in einem Programm zu verwenden, müssen Sie drei Schritte ausführen:

    Fragen strukturvorlage .

    Per Definition bedeutet dies, einen neuen Datentyp zu definieren, mit dem später Variablen dieses Typs definiert werden können.

    Definieren strukturinstanz .

    In diesem Schritt wird eine bestimmte Variable mit einer vordefinierten Struktur (unter Verwendung einer Vorlage) initialisiert.

    Organisieren zugriff auf Strukturelemente .

Es ist sehr wichtig, dass Sie von Anfang an verstehen, was der Unterschied zwischen ist beschreibung Struktur im Programm und seine definieren.

Beschreiben Die Struktur im Programm bedeutet nur, dass das Schema oder die Vorlage angegeben wird. Es ist kein Speicher zugeordnet.

Diese Vorlage kann nur als Information für den Übersetzer über die Position der Felder und ihre Standardwerte betrachtet werden.

Definieren Struktur bedeutet, den Übersetzer anzuweisen, Speicher zuzuweisen und diesem Speicherbereich einen symbolischen Namen zuzuweisen.

Sie können die Struktur in einem Programm nur einmal beschreiben und beliebig oft definieren.

Beschreibung der Strukturvorlage

Die Beschreibung der Strukturvorlage hat die folgende Syntax:

strukturname STRUC

strukturname ENDE

Hier ist eine Folge von Anweisungen, die Daten beschreiben db, dw, dd, dq und dt.

Ihre Operanden bestimmen die Größe der Felder und gegebenenfalls die Anfangswerte. Diese Werte werden wahrscheinlich bei der Definition der Struktur in den entsprechenden Feldern initialisiert.

Wie wir bei der Beschreibung der Vorlage festgestellt haben, wird kein Speicher zugewiesen, da dies nur Informationen für den Übersetzer sind.

Ort Die Vorlage im Programm kann beliebig sein, muss sich jedoch gemäß der Logik des Single-Pass-Übersetzers bis zu der Stelle befinden, an der die Variable mit dem Typ dieser Struktur definiert ist. Das heißt, wenn eine Variable mit dem Typ einer Struktur in einem Datensegment beschrieben wird, muss ihre Vorlage am Anfang des Datensegments oder davor platziert werden.

Betrachten wir die Arbeit mit Strukturen am Beispiel der Modellierung einer Datenbank mit Mitarbeitern einer bestimmten Abteilung.

Der Einfachheit halber sind wir uns einig, dass alle Felder symbolisch sind, um die Probleme der Konvertierung von Informationen bei der Eingabe zu vermeiden.

Definieren wir die Datensatzstruktur dieser Datenbank mit der folgenden Vorlage:

Daten mit einem Strukturtyp definieren

Um die mit der Vorlage im Programm beschriebene Struktur zu verwenden, müssen Sie eine Variable mit dem Typ dieser Struktur definieren. Hierzu wird folgende Syntax verwendet:

[Variablenname] Strukturname

    variablennamen - Kennung einer Variablen dieses Strukturtyps.

    Der Variablenname ist optional. Wenn Sie es nicht angeben, wird einfach ein Speicherbereich aus der Summe der Längen aller Strukturelemente zugewiesen.

    liste von Werten - eine durch Kommas getrennte Liste von Anfangswerten von Strukturelementen in spitzen Klammern.

    Seine Zuordnung ist ebenfalls optional.

    Wenn die Liste unvollständig ist, werden alle Strukturfelder für diese Variable mit Werten aus der Vorlage initialisiert, sofern vorhanden.

    Es ist möglich, einzelne Felder zu initialisieren. In diesem Fall müssen die fehlenden Felder durch Kommas getrennt werden. Fehlende Felder werden mit Werten aus der Strukturvorlage initialisiert. Wenn wir beim Definieren einer neuen Variablen mit dem Typ dieser Struktur mit allen Feldwerten in ihrer Vorlage übereinstimmen (dh standardmäßig festgelegt), müssen Sie nur spitze Klammern schreiben.

    Z.B: sieger Arbeiter.

Definieren wir beispielsweise mehrere Variablen mit dem Typ der oben beschriebenen Struktur.

Methoden zum Arbeiten mit Struktur

Die Idee, einen strukturierten Typ in eine beliebige Programmiersprache einzuführen, besteht darin, Variablen unterschiedlichen Typs in einem Objekt zu kombinieren.

Die Sprache muss über eine Möglichkeit verfügen, innerhalb einer bestimmten Instanz der Struktur auf diese Variablen zuzugreifen. Um auf ein Feld einer Struktur in einem Befehl zu verweisen, wird ein spezieller Operator verwendet - symbol ". "(Punkt)... Es wird in der folgenden Syntax verwendet:

    adressausdruck- die Kennung einer Variablen eines Strukturtyps oder eines Ausdrucks in Klammern gemäß den unten angegebenen syntaktischen Regeln (Abb. 1);

    strukturfeldname - Der Name des Feldes aus der Strukturvorlage.

    Tatsächlich ist dies auch eine Adresse oder vielmehr der Versatz des Feldes vom Anfang der Struktur.

Somit ist der Betreiber " . "(Punkt) wertet den Ausdruck aus

Zahl: fünf. Die Syntax eines Adressausdrucks in einem Strukturfeldzugriffsoperator

Lassen Sie uns am Beispiel der von uns definierten Struktur demonstrieren arbeiter Einige Techniken zum Arbeiten mit Strukturen.

Zum Beispiel extrahieren in axt Feldwerte mit dem Alter. Da es unwahrscheinlich ist, dass das Alter einer arbeitsfähigen Person mehr als 99 Jahre beträgt, nachdem der Inhalt dieses Zeichenfeldes in das Register eingetragen wurde axt Es ist praktisch, es mit dem Befehl in eine binäre Darstellung umzuwandeln aad.

Seien Sie vorsichtig, da aufgrund des Prinzips der Datenspeicherung "Wenig signifikantes Byte mindestens signifikante Adresse" Die höchste Altersziffer wird eingegeben alund der jüngste - in ah.

Verwenden Sie zum Anpassen einfach den Befehl xchg al, ah:

mov axe, Wort ptr sotr1.age; in al age sotr1

oder Sie können dies tun:

Weitere Arbeiten mit einem Array von Strukturen werden auf die gleiche Weise wie mit einem eindimensionalen Array durchgeführt. Hier stellen sich mehrere Fragen:

Was ist mit der Größe und wie organisiert man die Indizierung von Array-Elementen?

Ähnlich wie bei anderen im Programm definierten Bezeichnern weist der Übersetzer dem Typattribut den Namen des Strukturtyps und den Namen der Strukturtypvariablen zu. Der Wert dieses Attributs ist die Größe in Bytes, die von den Feldern dieser Struktur belegt wird. Sie können diesen Wert mit dem Operator abrufen art.

Nachdem die Größe einer Strukturinstanz bekannt geworden ist, ist es nicht schwierig, die Indizierung in einem Array von Strukturen zu organisieren.

Z.B:

Wie kopiere ich ein Feld von einer Struktur in das entsprechende Feld einer anderen Struktur? Oder wie kopiert man die gesamte Struktur? Kopieren wir das Feld nam dritter Mitarbeiter vor Ort nam fünfter Mitarbeiter:

mas_sotr Arbeiter 10 dup ()

mov bx, offset mas_sotr

mov si, (Typarbeiter) * 2; si \u003d 77 * 2

mov di, (Typarbeiter) * 4; si \u003d 77 * 4

Es scheint mir, dass das Handwerk eines Programmierers früher oder später eine Person wie eine gute Hausfrau aussehen lässt. Er ist wie sie ständig auf der Suche nach einem Ort, an dem er etwas retten, zurückschneiden und aus einem Minimum an Produkten ein wunderbares Abendessen machen kann. Und wenn dies gelingt, wird moralische Befriedigung nicht weniger und vielleicht mehr erreicht als durch ein wunderbares Abendessen mit einer Hausfrau. Der Grad dieser Befriedigung scheint mir vom Grad der Liebe zu Ihrem Beruf abzuhängen.

Auf der anderen Seite entspannen Erfolge bei der Entwicklung von Software und Hardware den Programmierer etwas, und oft wird eine Situation beobachtet, die dem bekannten Sprichwort über eine Fliege und einen Elefanten ähnelt - um ein kleines Problem zu lösen, werden schwere Mittel eingesetzt, deren Wirksamkeit im allgemeinen Fall nur dann von Bedeutung ist, wenn Umsetzung relativ großer Projekte.

Das Vorhandensein der folgenden zwei Arten von Daten in der Sprache erklärt sich wahrscheinlich aus dem Wunsch der "Hostess", den Arbeitsbereich der Tabelle (RAM) bei der Zubereitung von Speisen oder beim Platzieren von Produkten (Programmdaten) so effizient wie möglich zu nutzen.

Einführung.

Die Sprache, in der das ursprüngliche Programm geschrieben ist, wird aufgerufen eingangsprache und die Sprache, in die es zur Ausführung durch den Prozessor übersetzt wird, ist wochenendesprache. Der Prozess der Konvertierung einer Eingabesprache in eine Ausgabesprache wird aufgerufen Übertragung.Da Prozessoren Programme in der Maschinensprache von Binärcodes ausführen können, die nicht zum Programmieren verwendet wird, ist die Übersetzung aller Quellprogramme erforderlich. Bekannt zwei WegeÜbersetzungen: Zusammenstellung und Interpretation.

Wann zusammenstellungdas ursprüngliche Programm wird zunächst vollständig in ein gleichwertiges Programm in der Ausgabesprache übersetzt objektprogramm und dann ausgeführt. Dieser Prozess wird mit einem speziellen implementiert programme,namens der Compiler.Ein Compiler, für den die Eingabesprache eine symbolische Darstellung der Maschinensprache (Ausgabesprache) von Binärcodes ist, wird aufgerufen assembler.

Wann interpretationenjede Textzeile im Quellprogramm wird analysiert (interpretiert) und der darin angegebene Befehl wird sofort ausgeführt. Die Umsetzung dieser Methode wird anvertraut dolmetscherprogramm.Die Interpretation dauert lange. Um die Effizienz zu erhöhen, konvertiert der Interpreter zunächst alle Zeilen, anstatt jede Zeile zu verarbeiten mannschaftzeichenfolgen zu Zeichen (

). Die erzeugte Folge von Symbolen wird verwendet, um die dem ursprünglichen Programm zugewiesenen Funktionen auszuführen.

Die unten beschriebene Assemblersprache wird mithilfe der Kompilierung implementiert.

Merkmale der Sprache.

Hauptmerkmale des Assemblers:

● Anstelle von Binärcodes verwendet die Sprache symbolische Namen - mnemonik.Zum Beispiel für den Additionsbefehl (

) Mnemonik wird verwendet

Subtraktion (

multiplikation (

Abteilungen (

usw. Symbolische Namen werden auch zum Adressieren von Speicherplätzen verwendet. Für die Programmierung in Assemblersprache müssen Sie anstelle von Binärcodes und Adressen nur die symbolischen Namen kennen, die der Assembler in Binärcodes übersetzt.

jede Aussage stimmt überein ein Maschinenbefehl(Code), dh es gibt eine Eins-zu-Eins-Entsprechung zwischen Maschinenanweisungen und Bedienern in einem Assembler-Programm;

● Sprache bietet Zugriff zu allen Objektenund Teams. Hochsprachen haben diese Fähigkeit nicht. Mit der Assemblersprache können Sie beispielsweise das Registerbit von Flags und eine Hochsprache überprüfen (z. B.

) hat diese Fähigkeit nicht. Beachten Sie, dass Sprachen für die Systemprogrammierung (z. B. C) häufig eine Zwischenposition einnehmen. In Bezug auf die Barrierefreiheit sind sie der Assemblersprache näher, verfügen jedoch über eine Syntax auf hoher Ebene.

● Assemblersprache ist keine universelle Sprache.Für jede spezifische Gruppe von Mikroprozessoren gibt es einen eigenen Assembler. Hochsprachen haben diesen Nachteil nicht.

Im Gegensatz zu Hochsprachen ist das Schreiben und Debuggen eines Assembler-Programms zeitaufwändig. Trotzdem erhielt Assemblersprache breite Verwendungaufgrund der folgenden Umstände:

● Ein in Assemblersprache geschriebenes Programm ist viel kleiner und arbeitet viel schneller als ein in einer höheren Sprache geschriebenes Programm. Bei einigen Anwendungen spielen diese Indikatoren eine wichtige Rolle, z. B. bei vielen Systemprogrammen (einschließlich Compilern), Programmen in Kreditkarten, Mobiltelefonen, Gerätetreibern usw.;

● Einige Verfahren erfordern vollen Zugriff auf die Hardware, was in der Hochsprache normalerweise nicht möglich ist. Dieser Fall umfasst Interrupts und Interrupt-Handler in Betriebssystemen sowie Gerätesteuerungen in eingebetteten Systemen, die in Echtzeit arbeiten.

In den meisten Programmen ist nur ein kleiner Prozentsatz des gesamten Codes für einen großen Prozentsatz der Ausführungszeit des Programms verantwortlich. In der Regel sind 1% des Programms für 50% der Ausführungszeit und 10% des Programms für 90% der Ausführungszeit verantwortlich. Um ein bestimmtes Programm unter realen Bedingungen zu schreiben, werden daher sowohl ein Assembler als auch eine der Hochsprachen verwendet.

Operatorformat in Assemblersprache.

Ein Programm in Assemblersprache ist eine Liste von Befehlen (Anweisungen, Sätze), die jeweils eine separate Zeile belegen und vier Felder enthalten: ein Beschriftungsfeld, ein Operationsfeld, ein Operandenfeld und ein Kommentarfeld. Für jedes Feld gibt es eine separate Spalte.

Beschriftungsfeld.

Spalte 1 ist für das Beschriftungsfeld zugewiesen. Die Beschriftung ist ein symbolischer Name oder eine Kennung. adressenerinnerung. Es ist notwendig, um:

● einen bedingten oder bedingungslosen Sprung zum Befehl machen;

● Zugriff auf den Ort erhalten, an dem die Daten gespeichert sind.

Solche Aussagen sind gekennzeichnet. Zur Bezeichnung eines Namens werden (Groß-) Buchstaben des englischen Alphabets und Zahlen verwendet. Vor dem Namen muss ein Buchstabe und vor dem Ende ein Doppelpunkttrennzeichen stehen. Ein Label mit einem Doppelpunkt kann in eine separate Zeile und ein Opcode in die nächste Zeile in Spalte 2 geschrieben werden, was die Arbeit des Compilers vereinfacht. Das Fehlen eines Doppelpunkts erlaubt es nicht, ein Etikett von einem Opcode zu unterscheiden, wenn sie sich in separaten Zeilen befinden.

In einigen Versionen der Assemblersprache werden Doppelpunkte nur nach Befehlsbeschriftungen, nicht jedoch nach Datenbeschriftungen platziert, und die Länge der Beschriftung kann auf 6 oder 8 Zeichen begrenzt werden.

Das Beschriftungsfeld sollte keine identischen Namen enthalten, da die Beschriftung den Befehlsadressen zugeordnet ist. Wenn während der Programmausführung kein Befehl oder keine Daten aus dem Speicher aufgerufen werden müssen, bleibt das Beschriftungsfeld leer.

Operationscodefeld.

Dieses Feld enthält den Mnemonikcode des Befehls oder Pseudobefehls (siehe unten). Der Mnemonikcode der Befehle wird von den Sprachdesignern ausgewählt. In Assemblersprache

mnemonik zum Laden des Registers aus dem Speicher ausgewählt

), und um den Inhalt des Registers im Speicher zu speichern - die Mnemonik

). In Assemblersprachen

für beide Operationen kann jeweils ein Name verwendet werden

Wenn die Auswahl der Mnemoniknamen beliebig sein kann, ist die Verwendung von zwei Maschinenbefehlen auf die Architektur der Prozessoren zurückzuführen

Die Register-Mnemonik hängt auch von der Assembler-Version ab (Tabelle 5.2.1).

Operandenfeld.

Weitere für den Vorgang erforderliche Informationen finden Sie hier. Im Bereich der Operanden für Sprungbefehle werden die Adresse angezeigt, an die Sie springen möchten, sowie Adressen und Register, die Operanden für einen Maschinenbefehl sind. Als Beispiel geben wir Operanden an, die für 8-Bit-Prozessoren verwendet werden können

● numerische Daten,

in verschiedenen Zahlensystemen dargestellt. Um das verwendete Zahlensystem anzuzeigen, folgt auf die Konstante einer der lateinischen Buchstaben: B,

Dementsprechend binäre, oktale, hexadezimale, dezimale Zahlensysteme (

sie müssen es nicht aufschreiben). Wenn die erste Ziffer einer Hexadezimalzahl A, B, C ist,

Dann wird eine unbedeutende 0 (Null) vor hinzugefügt;

● Codes der internen Register des Mikroprozessors und der Speicherzellen

M (Informationsquellen oder -empfänger) in Form der Buchstaben A, B, C,

M oder ihre Adressen in einem beliebigen Zahlensystem (z. B. 10B - Registeradresse

im binären System);

● Bezeichner,

für Registerpaare von Flugzeugen,

Die ersten Buchstaben B,

H; für ein Paar Akkumulator und Zeichenregister -

;; für den Befehlszähler -

; für den Stapelzeiger -

● Beschriftungen, die die Adressen der Operanden oder die nächsten Anweisungen in der Bedingung angeben

(wenn die Bedingung erfüllt ist) und bedingungslose Sprünge.Zum Beispiel der Operand M1 im Befehl

bedeutet die Notwendigkeit eines bedingungslosen Übergangs zum Befehl, dessen Adresse im Beschriftungsfeld mit der Kennung M1 gekennzeichnet ist;

● Ausdrücke,

die durch Verknüpfen der obigen Daten unter Verwendung von arithmetischen und logischen Operatoren konstruiert werden. Beachten Sie, dass die Art und Weise, wie Datenraum reserviert wird, von der Sprachversion abhängt. Assembler-Entwickler für

Definieren Sie ein Wort) und führen Sie später eine Alternative ein.

das war von Anfang an in der Sprache für Prozessoren

In der Sprachversion

benutzt von

Konstante definieren).

Prozessoren verarbeiten Operanden unterschiedlicher Länge. Um es zu definieren, haben die Assembler-Entwickler verschiedene Entscheidungen getroffen, zum Beispiel:

II-Register unterschiedlicher Länge haben unterschiedliche Namen: ЕАХ - zum Platzieren von 32-Bit-Operanden (Typ

); АХ - für 16-Bit (Typ

und AH - für 8-Bit (Typ

● für Prozessoren

zu jedem Opcode werden Suffixe hinzugefügt: Suffix

Für Typ

;; Suffix ".B" für Typ

für Operanden unterschiedlicher Länge werden unterschiedliche Opcodes verwendet, um beispielsweise ein Byte, ein Halbwort (

) und Wörter im 64-Bit-Register werden Opcodes verwendet

beziehungsweise.

Kommentarfeld.

Dieses Feld enthält Erläuterungen zu den Aktionen des Programms. Kommentare haben keinen Einfluss auf den Betrieb des Programms und sind für Menschen bestimmt. Sie können erforderlich sein, um das Programm zu ändern, was ohne solche Kommentare selbst für erfahrene Programmierer völlig unverständlich sein kann. Ein Kommentar beginnt mit einem Symbol und dient zum Erklären und Dokumentieren von Programmen. Der Startcharakter eines Kommentars kann sein:

● Semikolon (;) in Sprachen für Unternehmensprozessoren

● Ausrufezeichen (!) In Sprachen für

Vor jeder separaten Kommentarzeile steht ein Startzeichen.

Pseudobefehle (Direktiven).

In der Assemblersprache gibt es zwei Haupttypen von Befehlen:

Basicanweisungen, die dem Maschinencode des Prozessors entsprechen. Diese Befehle führen die gesamte vom Programm bereitgestellte Verarbeitung aus.

Pseudobefehle,oder richtlinien,entwickelt, um den Prozess der Übersetzung eines Programms in die Sprache der Codekombinationen zu unterstützen. Als Beispiel in der Tabelle. 5.2.2 Einige Pseudobefehle vom AC-Sampler werden gegeben

für die Familie

.

Beim Programmieren gibt es Situationen, in denen laut Befehl dieselbe Befehlskette viele Male wiederholt werden muss. Um aus dieser Situation herauszukommen, können Sie:

● Schreiben Sie die gewünschte Befehlsfolge, wenn sie auftritt. Dieser Ansatz vergrößert das Programm.

● Bilden Sie aus dieser Sequenz eine Prozedur (Unterprogramm) und rufen Sie sie gegebenenfalls auf. Diese Ausgabe hat ihre Nachteile: Jedes Mal, wenn Sie einen speziellen Prozeduraufrufbefehl und einen Rückgabebefehl ausführen müssen, kann dies mit einer kurzen und häufig verwendeten Sequenz die Geschwindigkeit des Programms erheblich verringern.

Die einfachste und effizienteste Möglichkeit, eine Befehlskette mehrmals zu wiederholen, ist die Verwendung makro,dies kann als Pseudobefehl betrachtet werden, der eine Gruppe von Befehlen, die häufig in einem Programm vorkommen, erneut sendet.

Ein Makro oder Makro ist durch drei Aspekte gekennzeichnet: Makrodefinition, Makroumkehr und Makroexpansion.

Makrodefinition

Dies ist eine Bezeichnung für eine wiederholt wiederholte Folge von Programmbefehlen, die für Links im Programmtext verwendet werden.

Die Makrodefinition hat folgende Struktur:

Liste der Ausdrücke; Makrodefinition

In der obigen Struktur einer Makrodefinition können drei Teile unterschieden werden:

● Titel

ein Makro, das einen Namen enthält

Pseudo-Befehl

und eine Reihe von Parametern;

● mit Punkten markiert körpermakro;

● Team

endungen

makros.

Ein Satz von Makrodefinitionsparametern enthält eine Liste aller Parameter, die im Operandenfeld für die ausgewählte Befehlsgruppe aufgeführt sind. Wenn diese Parameter früher im Programm angegeben wurden, können sie im Header der Makrodefinition weggelassen werden.

Verwenden Sie die aus dem Namen bestehende Adresse, um die ausgewählte Befehlsgruppe wieder zusammenzusetzen

makros und eine Liste von Parametern mit anderen Werten.

Wenn der Assembler beim Kompilieren auf eine Makrodefinition stößt, speichert er diese in der Makrodefinitionstabelle. Bei späteren Auftritten im Programm des Namens (

) des Makros ersetzt der Assembler es durch den Hauptteil des Makros.

Die Verwendung eines Makronamens als Opcode wird aufgerufen makrozirkulation(durch einen Makroaufruf), und seine Ersetzung durch den Hauptteil des Makros ist makroerweiterung.

Wenn das Programm als Folge von Zeichen (Buchstaben, Zahlen, Leerzeichen, Interpunktion und Wagenrücklauf für eine neue Zeile) dargestellt wird, besteht die Makroerweiterung darin, einige Zeichenfolgen aus dieser Reihenfolge durch andere Zeichenfolgen zu ersetzen.

Die Makroerweiterung erfolgt während des Assemblierungsprozesses, nicht während der Programmausführung. Die Bearbeitung von Zeichenketten liegt in der Verantwortung von makrofonds.

Der Montageprozess wird durchgeführt in zwei Durchgängen:

● Beim ersten Durchgang werden alle Makrodefinitionen gespeichert und Makroaufrufe erweitert. In diesem Fall wird das ursprüngliche Programm gelesen und in ein Programm konvertiert, in dem alle Makrodefinitionen entfernt werden und jeder Makroaufruf durch einen Makrokörper ersetzt wird.

● Im zweiten Durchgang wird das resultierende Programm ohne Makros verarbeitet.

Parametrisierte Makros.

Um mit wiederholten Befehlssequenzen zu arbeiten, deren Parameter unterschiedliche Werte annehmen können, werden die folgenden Makrodefinitionen bereitgestellt:

● mit tatsächlichparameter, die in das Feld der Operanden des Makroaufrufs eingefügt werden;

● mit formalparameter. Beim Erweitern des Makros wird jeder formale Parameter, der im Hauptteil des Makros angezeigt wird, durch den entsprechenden tatsächlichen Parameter ersetzt.

verwenden von Makros mit Parametern.

Programm 1 zeigt zwei ähnliche Befehlssequenzen, die sich darin unterscheiden, dass die erste von ihnen P und tauscht

Und der zweite

Programm 2 enthält ein Makro mit zwei formalen Parametern P1 und P2. Während der Makroerweiterung wird jedes P1-Zeichen im Makrokörper durch den ersten Aktualparameter (P, ersetzt).

) und P2 wird durch den zweiten Istparameter ersetzt (

) aus Programm Nr. 1. In der Makrozone

programm 2 ist markiert: P,

Der erste Aktualparameter,

Zweiter Istparameter.

Programm 1

Programm 2

MOV EBX, Q MOV EAX, Pl

MOV Q, EAX MOV EBX, P2

MOV P, EBX MOV P2, EAX

Erweiterte Funktionen.

Betrachten wir einige erweiterte Funktionen der Sprache

Wenn das Makro mit dem Befehl für die bedingte Verzweigung und der Beschriftung, zu der die Verzweigung erstellt wird, zwei- oder mehrmals aufgerufen wird, wird die Beschriftung dupliziert (das Problem der doppelten Beschriftung), was zu einem Fehler führt. Daher wird bei jedem Aufruf eine separate Bezeichnung (vom Programmierer) als Parameter zugewiesen. In der Sprache

das Label wird als lokal deklariert (

) und dank seiner erweiterten Funktionen generiert der Assembler bei jeder Erweiterung eines Makros automatisch eine andere Bezeichnung.

mit dieser Option können Sie Makros in anderen Makros definieren. Diese erweiterte Funktion ist sehr nützlich, wenn sie mit einer bedingten Verknüpfung kombiniert wird. Erwägen

WENN WORDSIZE GT 16 M2 MACRO

Makro M2 kann in beiden Teilen der Anweisung definiert werden

Die Definition hängt jedoch davon ab, auf welchem \u200b\u200bProzessor das Programm aufgebaut ist: 16-Bit oder 32-Bit. Wenn M1 nicht aufgerufen wird, wird das Makro M2 überhaupt nicht definiert.

Eine weitere erweiterte Funktion ist, dass Makros andere Makros aufrufen können, einschließlich sich selbst - rekursivanruf. Im letzteren Fall muss das Makro einen Parameter an sich selbst übergeben, der sich mit jeder Erweiterung ändert, um keine Endlosschleife zu erhalten prüfendiesen Parameter und beenden Sie die Rekursion, wenn der Parameter einen bestimmten Wert erreicht.

Informationen zur Verwendung von Makros im Assembler.

Bei Verwendung von Makros muss der Assembler zwei Funktionen ausführen können: makrodefinitionen beibehaltenund makroaufrufe verlängern.

Erhaltung von Makros.

Alle Makronamen werden in einer Tabelle gespeichert. Auf jeden Namen folgt ein Zeiger auf das entsprechende Makro, damit es bei Bedarf aufgerufen werden kann. Einige Assembler haben eine separate Tabelle für Makronamen, andere eine allgemeine Tabelle, in der sich neben den Namen der Makros alle Maschinenanweisungen und Anweisungen befinden.

Wenn Sie beim Zusammenbau auf ein Makro stoßen erstellt:

neues Tabellenelementmit dem Namen des Makros, der Anzahl der Parameter und einem Zeiger auf eine andere Tabelle von Makrodefinitionen, in der der Hauptteil des Makros gespeichert wird;

● Liste formalparameter.

Dann wird der Hauptteil des Makros gelesen und in der Tabelle der Makrodefinitionen gespeichert, die nur eine Folge von Symbolen ist. Formale Parameter im Hauptteil der Schleife sind mit einem speziellen Symbol gekennzeichnet.

Interne Darstellung eines Makros

aus dem obigen Beispiel für Programm 2 (S. 244) geht Folgendes hervor:

MOV EAX, MOV EBX, MOV MOV &

dabei wird ein Semikolon als Wagenrücklaufzeichen und das kaufmännische Zeichen & als formales Parameterzeichen verwendet.

Erweiterung von Makroaufrufen.

Immer wenn ein Makro während der Montage angetroffen wird, wird es in der Makrotabelle gespeichert. Wenn das Makro aufgerufen wird, hält der Assembler das Lesen der Eingabe vom Eingabegerät vorübergehend an und beginnt mit dem Lesen des gespeicherten Makrokörpers. Die aus dem Hauptteil des Makros extrahierten formalen Parameter werden durch die tatsächlichen Parameter ersetzt und vom Aufruf bereitgestellt. Das kaufmännische & vor den Parametern ermöglicht es dem Assembler, diese zu erkennen.

Trotz der Tatsache, dass es viele Versionen von Assembler gibt, haben die Assembler-Prozesse gemeinsame Merkmale und sind in vielerlei Hinsicht ähnlich. Die Arbeit des Assemblers mit zwei Durchgängen wird unten diskutiert.

Assembler mit zwei Durchgängen.

Das Programm besteht aus einer Reihe von Operatoren. Daher können Sie beim Zusammenbau anscheinend die folgende Abfolge von Aktionen verwenden:

● in Maschinensprache übersetzen;

● Übertragen Sie den empfangenen Maschinencode in eine Datei und den entsprechenden Teil der Liste in eine andere Datei.

● Wiederholen Sie die obigen Schritte, bis das gesamte Programm übersetzt wurde.

Dieser Ansatz ist jedoch nicht effektiv. Ein Beispiel ist das sogenannte Problem lookahead-Links.Wenn die erste Anweisung ein Sprung zur P-Anweisung ganz am Ende des Programms ist, kann der Assembler sie nicht übersetzen. Er muss zuerst die Adresse des Operators P bestimmen, und dazu ist es notwendig, das gesamte Programm zu lesen. Jedes vollständige Lesen des Originalprogramms wird aufgerufen passage.Wir zeigen Ihnen, wie Sie das Forward Link-Problem mit zwei Durchgängen lösen können:

der erste Durchgang folgt sammelnspeichern Sie alle Definitionen von Symbolen (einschließlich Beschriftungen) in der Tabelle und lesen und montieren Sie beim zweiten Durchgang jeden Operator. Diese Methode ist relativ einfach, aber der zweite Durchgang durch das ursprüngliche Programm erfordert zusätzliche Zeit für E / A-Operationen.

● beim ersten Durchgang, verwandelnprogrammieren Sie es in eine Zwischenform und speichern Sie es in der Tabelle. Führen Sie den zweiten Durchgang nicht gemäß dem ursprünglichen Programm, sondern gemäß der Tabelle aus. Diese Montagemethode spart Zeit, da beim zweiten Durchgang keine E / A ausgeführt wird.

Erster Pass.

Erstes Passziel- Erstellen Sie eine Symboltabelle. Wie oben erwähnt, besteht ein weiteres Ziel des ersten Durchgangs darin, alle Makros beizubehalten und Aufrufe so zu erweitern, wie sie angezeigt werden. Daher erfolgen sowohl die Symboldefinition als auch die Makroerweiterung in einem Durchgang. Das Symbol kann entweder sein etikette,oder wert,dem mit der Direktive ein bestimmter Name zugewiesen wird:

; Wert - Puffergröße

Durch Zuweisen von Werten zu symbolischen Namen im Feld für die Befehlsbezeichnung legt der Assembler im Wesentlichen die Adressen fest, die jeder Befehl während der Programmausführung haben wird. Hierzu spart der Assembler während des Montageprozesses befehlsadressenzähler(

) als spezielle Variable. Zu Beginn des ersten Durchlaufs wird der Wert der speziellen Variablen auf 0 gesetzt und nach jedem verarbeiteten Befehl um die Länge dieses Befehls erhöht. Als Beispiel in der Tabelle. 5.2.3 ist ein Fragment des Programms, das die Länge der Befehle und die Werte des Zählers angibt. Beim ersten Durchgang werden Tabellen gebildet symbolische Namen, Richtlinienund opcodes,und wenn nötig wörtlichtabelle. Ein Literal ist eine Konstante, für die der Assembler automatisch Speicher reserviert. Wir stellen sofort fest, dass moderne Prozessoren Anweisungen mit unmittelbaren Adressen enthalten, sodass ihre Acsembler keine Literale unterstützen.

Symbolische Namenstabelle

enthält ein Element für jeden Namen (Tabelle 5.2.4). Jedes Element der Tabelle der symbolischen Namen enthält den Namen selbst (oder einen Zeiger darauf), seinen numerischen Wert und manchmal einige zusätzliche Informationen, die Folgendes umfassen können:

● die Länge des dem Symbol zugeordneten Datenfelds;

● Bits der Speicherumverteilung (die anzeigen, ob sich der Wert eines Symbols ändert, wenn das Programm an einer anderen Adresse als dem beabsichtigten Assembler geladen wird);

● Informationen darüber, ob von außerhalb des Verfahrens auf das Symbol zugegriffen werden kann.

Symbolische Namen sind Bezeichnungen. Sie können mithilfe von Operatoren angegeben werden (z. B.

Richtlinientabelle.

In dieser Tabelle sind alle Anweisungen oder Pseudobefehle aufgeführt, die beim Zusammenstellen eines Programms auftreten.

Operationscodetabelle.

Für jeden Operationscode enthält die Tabelle separate Spalten: Bezeichnung des Operationscodes, Operand 1, Operand 2, Hexadezimalwert des Operationscodes, Befehlslänge und Befehlstyp (Tabelle 5.2.5). Operationscodes werden je nach Anzahl und Art der Operanden in Gruppen unterteilt. Der Befehlstyp bestimmt die Gruppennummer und gibt die Prozedur an, die aufgerufen wird, um alle Befehle in dieser Gruppe zu verarbeiten.

Zweiter Durchgang.

Zweites Passziel- Erstellung eines Objektprogramms und ggf. Ausdruck des Montageprotokolls; Ausgabe der Informationen, die der Linker benötigt, um Prozeduren, die zu unterschiedlichen Zeiten zusammengestellt wurden, in einer ausführbaren Datei zu verknüpfen.

Im zweiten Durchgang (wie im ersten) werden die Zeilen mit den Anweisungen nacheinander gelesen und verarbeitet. Der ursprüngliche Operator und die daraus resultierende Ausgabe im Hexadezimalsystem objektder Code kann zum späteren Drucken gedruckt oder gepuffert werden. Nach dem Zurücksetzen des Befehlsadresszählers wird die nächste Anweisung aufgerufen.

Das ursprüngliche Programm kann Fehler enthalten, zum Beispiel:

das angegebene Symbol ist mehr als einmal undefiniert oder definiert.

● Der Opcode wird durch einen ungültigen Namen dargestellt (aufgrund eines Tippfehlers), wird nicht mit einer ausreichenden Anzahl von Operanden geliefert oder hat zu viele Operanden.

● Es gibt keinen Operator

Einige Assembler können ein undefiniertes Zeichen aufnehmen und ersetzen. In den meisten Fällen zeigt der Assembler jedoch eine Fehlermeldung auf dem Bildschirm an, wenn eine Anweisung mit einem Fehler erkannt wird, und versucht, den Assemblierungsprozess fortzusetzen.

Artikel zur Assemblersprache.

Damit eine Maschine menschliche Befehle auf Hardwareebene ausführen kann, muss eine bestimmte Abfolge von Aktionen in der Sprache "Nullen und Einsen" festgelegt werden. Der Assembler wird in dieser Angelegenheit Assistent. Es ist ein Dienstprogramm, das mit der Übersetzung von Befehlen in die Maschinensprache arbeitet. Das Schreiben eines Programms ist jedoch ein sehr mühsamer und komplexer Prozess. Diese Sprache ist nicht dazu gedacht, leichte und einfache Aktionen zu erstellen. Im Moment können Sie mit jeder verwendeten Programmiersprache (Assembler funktioniert hervorragend) besonders effiziente Aufgaben schreiben, die den Betrieb der Hardware stark beeinträchtigen. Der Hauptzweck besteht darin, Mikroanweisungen und kleine Codes zu erstellen. Diese Sprache bietet mehr Möglichkeiten als beispielsweise Pascal oder C.

Eine kurze Beschreibung der Assembler-Sprachen

Alle Programmiersprachen sind in Ebenen unterteilt: niedrig und hoch. Jedes syntaktische System der "Familie" von Assembler unterscheidet sich darin, dass es einige der Vorteile der am weitesten verbreiteten und modernsten Sprachen auf einmal vereint. Sie haben mit anderen gemeinsam, dass das Computersystem voll genutzt werden kann.

Eine Besonderheit des Compilers ist seine Benutzerfreundlichkeit. Dies unterscheidet es von denen, die nur mit hohen Pegeln arbeiten. Wenn Sie eine solche Programmiersprache berücksichtigen, ist Assembler doppelt so schnell und besser. Es dauert nicht lange, ein leichtes Programm darin zu schreiben.

Kurz über die Struktur der Sprache

Wenn wir allgemein über die Arbeit und die Struktur der Funktionsweise der Sprache sprechen, können wir mit Sicherheit sagen, dass ihre Befehle vollständig denen des Prozessors entsprechen. Das heißt, der Assembler verwendet Mnemonik-Codes, die für Menschen am bequemsten zu schreiben sind.

Im Gegensatz zu anderen Programmiersprachen verwendet Assembler bestimmte Bezeichnungen anstelle von Adressen, um Speicherorte zu schreiben. Sie werden beim Code-Ausführungsprozess in sogenannte Direktiven übersetzt. Dies sind relative Adressen, die den Prozessor nicht beeinflussen (sie werden nicht in die Maschinensprache übersetzt), aber für die Erkennung durch die Programmierumgebung selbst erforderlich sind.

Jede Prozessorzeile hat ihre eigene. In dieser Situation ist jeder Prozess, einschließlich des übersetzten, korrekt

Die Assemblersprache verfügt über mehrere Syntaxen, die im Artikel erläutert werden.

Pluspunkte der Sprache

Das wichtigste und bequemste Merkmal der Assemblersprache ist, dass damit jedes Programm für den Prozessor geschrieben werden kann, das sehr kompakt ist. Wenn sich herausstellt, dass der Code sehr groß ist, werden einige Prozesse in den Arbeitsspeicher umgeleitet. Gleichzeitig erledigen sie alles schnell genug und ohne Fehler, es sei denn, sie werden natürlich von einem qualifizierten Programmierer gesteuert.

Treiber, Betriebssysteme, BIOS, Compiler, Interpreter usw. sind Assembler-Programme.

Wenn Sie einen Disassembler verwenden, der von Maschine zu Maschine übersetzt wird, können Sie leicht verstehen, wie eine bestimmte Systemaufgabe funktioniert, auch wenn es keine Erklärung dafür gibt. Dies ist jedoch nur möglich, wenn die Programme leichtgewichtig sind. Leider ist es ziemlich schwierig, nicht triviale Codes zu verstehen.

Nachteile der Sprache

Leider ist es für Anfänger (und oft auch für Profis) schwierig, die Sprache zu analysieren. Der Assembler benötigt eine detaillierte Beschreibung des erforderlichen Befehls. Aufgrund der Notwendigkeit, Maschinenanweisungen zu verwenden, steigt die Wahrscheinlichkeit fehlerhafter Aktionen und die Komplexität der Ausführung.

Um selbst das einfachste Programm zu schreiben, muss ein Programmierer qualifiziert sein und sein Wissensstand ist hoch genug. Der durchschnittliche Spezialist schreibt leider oft schlechte Codes.

Wenn die Plattform, für die das Programm erstellt wird, aktualisiert wird, müssen alle Befehle manuell neu geschrieben werden - dies wird von der Sprache selbst benötigt. Der Assembler unterstützt nicht die Funktion der automatischen Regulierung des Zustands von Prozessen und des Austauschs von Elementen.

Sprachbefehle

Wie oben erwähnt, hat jeder Prozessor seinen eigenen Befehlssatz. Die einfachsten Elemente, die von einem Typ erkannt werden, sind die folgenden Codes:


Direktiven verwenden

Das Programmieren von Mikrocontrollern in der Sprache (Assembler erlaubt es und kommt perfekt mit der Funktion zurecht) der niedrigsten Ebene endet in den meisten Fällen gut. Es ist am besten, ressourcenbeschränkte Prozessoren zu verwenden. Für die 32-Bit-Technologie ist diese Sprache hervorragend. Sie können Anweisungen häufig in Codes sehen. Was ist das? Und wofür wird es verwendet?

Zunächst müssen Sie betonen, dass Direktiven nicht in Maschinensprache übersetzt werden. Sie regeln, wie der Compiler funktioniert. Im Gegensatz zu Befehlen unterscheiden sich diese Parameter mit unterschiedlichen Funktionen nicht aufgrund unterschiedlicher Prozessoren, sondern aufgrund eines unterschiedlichen Übersetzers. Zu den wichtigsten Richtlinien gehören:


Herkunft des Namens

Warum hat die Sprache ihren Namen bekommen - "Assembler"? Wir sprechen von einem Übersetzer und einem Compiler, die Daten verschlüsseln. Assembler bedeutet auf Englisch nichts anderes als ein Assembler. Das Programm wurde nicht manuell zusammengestellt, es wurde eine automatische Struktur verwendet. Darüber hinaus ist der Unterschied zwischen den Begriffen bei Benutzern und Spezialisten derzeit bereits verschwunden. Assemblersprache wird oft als Programmiersprache bezeichnet, obwohl es sich nur um ein Dienstprogramm handelt.

Aufgrund des allgemein akzeptierten kollektiven Namens erhalten einige Menschen die falsche Entscheidung, dass es eine einzige Sprache auf niedriger Ebene gibt (oder Standardnormen dafür). Damit der Programmierer verstehen kann, um welche Struktur es sich handelt, muss geklärt werden, für welche Plattform diese oder jene Assemblersprache verwendet wird.

Makro-Tools

Assemblersprachen, die relativ neu sind, verfügen über Makrofunktionen. Sie erleichtern das Schreiben und Ausführen des Programms. Aufgrund ihrer Anwesenheit führt der Übersetzer den geschriebenen Code um ein Vielfaches schneller aus. Wenn Sie eine bedingte Auswahl erstellen, können Sie einen großen Befehlsblock schreiben, und es ist einfacher, Makrowerkzeuge zu verwenden. Mit ihnen können Sie schnell zwischen Aktionen wechseln, wenn eine Bedingung erfüllt ist oder nicht.

Bei Verwendung von Anweisungen der Makrosprache erhält der Programmierer Assembly-Makros. Manchmal kann es weit verbreitet sein, und manchmal ist seine Funktionalität auf einen Befehl reduziert. Ihre Anwesenheit im Code erleichtert die Arbeit damit, macht ihn klarer und intuitiver. Sie sollten jedoch trotzdem vorsichtig sein - in einigen Fällen verschlechtern Makros im Gegenteil die Situation.

DIE KLINGEL

Es gibt diejenigen, die diese Nachrichten vor Ihnen lesen.
Abonnieren Sie, um die neuesten Artikel zu erhalten.
Email
Name
Nachname
Wie willst du The Bell lesen?
Kein Spam