X86 Zusammenbau-Sprache

X86-Zusammenbau-Sprache ist eine Familie von rückwärts kompatiblen Zusammenbau-Sprachen, die ein Niveau der Vereinbarkeit den ganzen Weg zurück zu Intel 8008 zur Verfügung stellen. X86-Zusammenbau-Sprachen werden verwendet, um Gegenstand-Code für die x86 Klasse von Verarbeitern zu erzeugen, die die Kernreihe von Intel und die Reihe von Phenom und Phenom II von AMD einschließt. Wie alle Zusammenbau-Sprachen verwendet es kurze Gedächtniskunst, um die grundsätzlichen Operationen zu vertreten, die die Zentraleinheit in einem Computer durchführen kann. Bearbeiter erzeugen manchmal Zusammenbau-Code als eine Zwischenstufe, wenn sie ein hohes Programm in den Maschinencode übersetzen. Betrachtet als eine Programmiersprache ist das Zusammenbau-Codieren maschinenspezifische und niedrige Stufe. Zusammenbau-Sprachen werden mehr normalerweise für ausführliche und/oder dringende Anwendungen wie kleine eingebettete Echtzeitsysteme oder Betriebssystemkerne und Gerät-Fahrer verwendet.

Geschichte

Intel 8088 und 8086 war die ersten Zentraleinheiten, um einen Befehlssatz zu haben, der jetzt allgemein x86 genannt wird. Diese 16-Bit-Zentraleinheiten waren eine Evolution der vorherigen Generation von 8-Bit-Zentraleinheiten wie die 8080, viele Eigenschaften und Instruktionen erbend, die für das 16-Bit-Zeitalter erweitert sind. Die 8088 und 8086 sowohl haben einen 20-Bit-Adressbus als auch innere 16-Bit-Register verwendet, aber während die 8086 einen 16-Bit-Datenbus hatten, hatten die 8088, die als eine niedrige Kostenauswahl für eingebettete Anwendungen beabsichtigt sind, einen 8-Bit-Datenbus. Die x86 Zusammenbau-Sprache bedeckt die vielen verschiedenen Versionen von Zentraleinheiten, die von Intel gefolgt sind; die 80188, 80186, 80286, 80386, 80486, Pentium, Pentium Pro, und so weiter, sowie non-Intel CPUs von AMD und Cyrix solcher als 5x86 und K6 Verarbeiter und der NEC V20. Der Begriff x86 gilt für jede Zentraleinheit, die die ursprüngliche Zusammenbau-Sprache führen kann (gewöhnlich, wird es mindestens einige der Erweiterungen auch führen).

Der moderne x86 Befehlssatz ist eine Obermenge von 8086 Instruktionen und eine Reihe von Erweiterungen auf diesen Befehlssatz, der mit dem Mikroprozessor von Intel 8008 begonnen hat. Fast volle binäre rückwärts gerichtete Vereinbarkeit besteht zwischen dem Span von Intel 8086 durch zur aktuellen Generation von x86 Verarbeitern, obwohl bestimmte Ausnahmen wirklich bestehen. In der Praxis ist es typisch, um Instruktionen zu verwenden, die auf irgendetwas später durchführen werden als Intel 80386 (oder völlig vereinbarer Klon) Verarbeiter, oder irgendetwas später als Intel Pentium (oder vereinbarer Klon) Verarbeiter, aber in den letzten Jahren haben verschiedene Betriebssysteme und Anwendungssoftware begonnen, modernere Verarbeiter zu verlangen oder mindestens für spätere spezifische Erweiterungen auf den Befehlssatz zu unterstützen (z.B. MMX, 3DNow! SSE/SSE2/SSE3).

Gedächtniskunst und opcodes

Jede x86 Montageanleitung wird durch einen mnemonischen vertreten, der, häufig verbunden mit einem oder mehr operands, zu einem oder mehr Bytes genannt einen opcode übersetzt; die NOP Instruktion übersetzt zu 0x90 zum Beispiel, und die HLT Instruktion übersetzt zu 0xF4. Es gibt Potenzial opcodes ohne mnemonischen dokumentierten, welche verschiedene Verarbeiter verschieden dolmetschen können, benimmt sich das Machen eines Programms mit ihnen inkonsequent oder erzeugt sogar eine Ausnahme auf einigen Verarbeitern. Diese opcodes tauchen häufig im Code auf, Konkurrenzen als eine Weise schreibend, den Code kleiner, schneller, eleganter zu machen oder gerade mit der Heldentat des Autors zu protzen.

Syntax

X86-Zusammenbau-Sprache hat zwei Hauptsyntax-Zweige: Syntax von Intel, die ursprünglich für die Dokumentation der x86 Plattform, und AT&T Syntax verwendet ist. Syntax von Intel ist im MS-DOS und der Windows-Welt, und AT&T dominierend Syntax ist in der Unix/Linux Welt dominierend, seitdem Unix an AT&T Glockenlaboratorien geschaffen wurde.

Hier ist eine Zusammenfassung der Hauptunterschiede zwischen der Syntax von Intel und AT&T Syntax:

Viele x86 Monteure verwenden Syntax von Intel einschließlich MASM, TASM, NASM, FASM und YASM. BENZIN hat beide Syntaxen seit der Version 2.10 über die.intel_syntax Direktive unterstützt.

Register

X86-Verarbeiter haben eine Sammlung von Registern, die verfügbar sind, um als Läden für binäre Daten verwendet zu werden. Insgesamt werden die Daten und Adressregister die allgemeinen Register genannt. Jedes Register hat einen speziellen Zweck zusätzlich dazu, was sie alle tun können.

  • AXT multipliziert/teilt
  • BX Index schreibt sich für die BEWEGUNG ein
  • CX zählen Register für Schnur-Operationen auf
  • DX Hafen richtet für IN und

Zusammen mit den allgemeinen Registern gibt es zusätzlich:

  • IP Instruktionszeigestock
  • FAHNEN
  • Segment-Register (CS, DS, ES, FS, GS, SS), die bestimmen, wo ein 64k Segment anfängt
  • Extraerweiterungsregister (MMX, 3DNow! SSE, usw.).

Das IP-Register weist zum Speicherausgleich der folgenden Instruktion im Codesegment hin (es weist zum ersten Byte der Instruktion hin). Auf das IP-Register kann vom Programmierer direkt nicht zugegriffen werden.

Die X86-Register können durch das Verwenden der MOV Instruktionen verwendet werden. Zum Beispiel:

Mov-Axt, 1234.

mov bx, Axt

kopiert den Wert 1234. (4660d) in die Register-AXT und kopiert dann den Wert des AXT-Registers ins BX-Register. (Syntax von Intel)

Das segmentierte Wenden

Die x86 Architektur im echten und virtuellen 8086 Weise-Gebrauch ein als Segmentation bekannter Prozess, Gedächtnis, nicht das flache in vielen anderen Umgebungen verwendete Speichermodell zu richten. Segmentation ist mit dem Bestehen einer Speicheradresse von zwei Teilen, einem Segment und einem Ausgleich verbunden; das Segment weist zum Anfang einer 64-Kilobyte-Gruppe von Adressen hin, und der Ausgleich bestimmt, wie weit von dieser beginnenden Adresse die gewünschte Adresse ist. Im segmentierten Wenden sind zwei Register für eine ganze Speicheradresse erforderlich: Ein, um das Segment, der andere zu halten, den Ausgleich zu halten. Um zurück in eine flache Adresse zu übersetzen, wird der Segment-Wert vier Bit verlassen (gleichwertig zur Multiplikation durch 2 oder 16) dann hinzugefügt zum Ausgleich ausgewechselt, um die volle Adresse zu bilden, die erlaubt, die 64k Barriere durch die kluge Wahl von Adressen zu brechen, obwohl es Programmierung beträchtlich komplizierter macht.

In der echten Weise nur, zum Beispiel, wenn DS die hexadecimal Nummer 0xDEAD und DX enthält, enthält die Nummer 0xCAFE, die sie auf den Speicheradress-0xDEAD * 0x10 + 0xCAFE = 0xEB5CE zusammen anspitzen würden. Deshalb kann die Zentraleinheit bis zu 1,048,576 Bytes (1 Mb) in der echten Weise richten. Durch das Kombinieren des Segmentes und Ausgleichs schätzt wir finden eine 20-Bit-Adresse.

Ursprünglicher IBM PC hat Programme auf 640 Kilobytes eingeschränkt, aber eine ausgebreitete Speicherspezifizierung wurde verwendet, um eine Bank durchzuführen, die Schema schaltet, das aus dem Gebrauch gefallen ist, als später Betriebssysteme, wie Windows, die größeren Adressbereiche von neueren Verarbeitern verwendet haben und ihre eigenen virtuellen Speicherschemas durchgeführt haben.

Geschützte Weise, mit Intel 80286 anfangend, wurde durch OS/2 verwertet. Mehrere Mängel, wie die Unfähigkeit, auf den BIOS und die Unfähigkeit zuzugreifen, zurück auf die echte Weise umzuschalten, ohne den Verarbeiter neu zu fassen, haben weit verbreiteten Gebrauch verhindert. Die 80286 wurden auch noch auf das Wenden des Gedächtnisses in 16-Bit-Segmenten beschränkt, bedeutend, dass auf nur 2 Bytes (64 Kilobytes) auf einmal zugegriffen werden konnte.

Um auf die verlängerte Funktionalität der 80286 zuzugreifen, würde das Betriebssystem den Verarbeiter in die geschützte Weise setzen, das 24-Bit-Wenden und so 2 Bytes des Gedächtnisses (16 Megabytes) ermöglichend.

In der geschützten Weise kann der Segment-Auswählende unten in drei Teile zerbrochen werden: Ein 13-Bit-Index, ein Tabellenhinweis hat gebissen, der bestimmt, ob der Zugang im GDT oder LDT und einem Gebetenen 2-Bit-Vorzug-Niveau ist; sieh x86 Speichersegmentation.

Wenn

man sich auf eine Adresse mit einem Segment und einem Ausgleich bezieht, wird die Notation von segment:offset verwendet, so im obengenannten Beispiel kann die flache Adresse 0xEB5CE als 0xDEAD:0xCAFE oder als ein Segment geschrieben werden und hat Register-Paar ausgeglichen; DS:DX.

Es gibt einige spezielle Kombinationen von Segment-Registern und allgemeinen Registern, die zu wichtigen Adressen hinweisen:

  • CS:IP (ist CS Codesegment, IP, ist Instruktionszeigestock) weist zur Adresse hin, wo der Verarbeiter das folgende Byte des Codes herbeiholen wird.
  • SS:SP (ist SS Stapel-Segment, SP, ist Stapel-Zeigestock) weist zur Adresse der Spitze des Stapels, d. h. dem am meisten kürzlich gestoßenen Byte hin.
  • DS:SI (ist DS Datensegment, SI, ist Quellindex) wird häufig verwendet, um hinzuweisen, um Daten zu spannen, der im Begriff ist, zu ES:DI kopiert zu werden.
  • ES:DI (ist ES Extrasegment, DI, ist Bestimmungsort-Index) wird normalerweise verwendet, um zum Bestimmungsort für eine Schnur-Kopie wie oben erwähnt hinzuweisen.

Intel 80386 hat drei Betriebsweisen gezeigt: echte Weise, geschützte Weise und virtuelle Weise. Die geschützte Weise, die in den 80286 debütiert hat, wurde erweitert, um den 80386 zu erlauben, bis zu 4 GB des Gedächtnisses zu richten, das ganze neue virtuelle 8086 Verfahren (VM86) hat es möglich gemacht, ein oder echtere Weise-Programme in einer geschützten Umwelt zu laufen, die größtenteils mit echter Weise wettgeeifert hat, obwohl einige Programme (normalerweise infolge Speicherwenden-Tricks oder des Verwendens unangegebener Op-Codes) nicht vereinbar waren.

Das flache 32-Bit-Speichermodell 80386's kann verlängerte geschützte Weise die wichtigste Eigenschaft-Änderung für die x86 Verarbeiter-Familie sein, bis AMD x86-64 2003 veröffentlicht hat, als es geholfen hat, in großem Umfang Adoption von Windows 3.1 zu steuern (der sich auf die geschützte Weise verlassen hat), seitdem Windows jetzt viele Anwendungen sofort, einschließlich DOS-Anwendungen, durch das Verwenden virtuellen Gedächtnisses und des einfachen Mehrbeschäftigens führen konnte.

Ausführungsweisen

Die x86 Verarbeiter unterstützen fünf Verfahrensweisen für X86-Code, Echte Weise, Geschützte Weise, Lange Weise, Virtuelle 86 Weise und Systemverwaltungsweise, in der einige Instruktionen verfügbar sind und andere sind nicht. Eine 16-Bit-Teilmenge von Instruktionen ist in der echten Weise verfügbar (alle x86 Verarbeiter), 16 Bit haben Weise (80286 vorwärts), V86 Weise (80386 und später) und SMM (Ein Intel i386SL, i486 und später) geschützt. In geschützter Weise von 32 Bit (Intel 80386 vorwärts) sind 32-Bit-Instruktionen (einschließlich späterer Erweiterungen) auch verfügbar; in der langen Weise (AMD Opteron vorwärts) sind 64-Bit-Instruktionen und mehr Register, auch verfügbar. Der Befehlssatz ist in jeder Weise ähnlich, aber das Speicherwenden und die Wortgröße ändern sich, verschiedene Programmierstrategien verlangend.

Die Weisen, in denen X86-Code darin durchgeführt werden kann, sind:

Schaltung von Weisen

Der Verarbeiter geht in echte Weise sofort nach der Macht darauf ein, so muss ein Betriebssystemkern oder anderes Programm, auf eine andere Weise ausführlich umschalten, wenn es in irgendetwas außer der echten Weise laufen möchte. Schaltung von Weisen wird durch das Ändern bestimmter Bit der Kontrollregister des Verarbeiters vollbracht, obwohl etwas Vorbereitung im Voraus in vielen Fällen erforderlich ist, und eine Postschalter-Reinigung erforderlich sein kann.

Instruktionstypen

Im Allgemeinen sind die Eigenschaften des modernen x86 Befehlssatzes:

  • Eine Kompaktverschlüsselung
  • Variable Länge und Anordnung unabhängig (verschlüsselt so kleiner endian, wie alle Daten in der x86 Architektur ist)
  • Hauptsächlich ein-Adresse- und Zweiadressinstruktionen das heißt, ist der erste operand auch der Bestimmungsort.
  • Gedächtnis operands sowohl als die Quelle als auch als der Bestimmungsort wird (oft verwendet an gerichtete Lesen/Schreiben-Stapel-Elemente mit kleinen unmittelbaren Ausgleichen) unterstützt.
  • Sowohl allgemeiner als auch impliziter Register-Gebrauch; obwohl alle sieben (zählenden) allgemeinen Register in 32-Bit-Weise und alle fünfzehn (zählenden) allgemeinen Register in 64-Bit-Weise, als Akkumulatoren oder für das Wenden frei verwendet werden können, werden die meisten von ihnen auch durch bestimmte (mehr oder weniger) spezielle Instruktionen implizit verwendet; betroffene Register müssen deshalb (normalerweise aufgeschobert), wenn aktiv, während solcher Befehlsfolgen provisorisch bewahrt werden.
  • Erzeugt bedingte Fahnen implizit durch den grössten Teil der ganzen Zahl ALU Instruktionen.
  • Unterstützt verschiedene Wenden-Weisen einschließlich des unmittelbaren, Ausgleichs und erkletterten Index, aber nicht mit dem PC relativ, außer Sprüngen (eingeführt als eine Verbesserung in der x86-64 Architektur).
  • Schließt Schwimmpunkt zu einem Stapel von Registern ein.
  • Enthält spezielle Unterstützung für Atominstruktionen (/, und Instruktionen der ganzen Zahl, die sich mit dem Präfix verbinden)
  • SIMD Instruktionen (Instruktionen, die parallele gleichzeitige einzelne Instruktionen auf vielen operands durchführen, die in angrenzenden Zellen von breiteren Registern verschlüsselt sind).

Stapel-Instruktionen

Die x86 Architektur hat Hardware-Unterstützung für einen Ausführungsstapel-Mechanismus. Instruktionen solcher als, und

Wenn

es einen Stapel-Rahmen aufstellt, um lokale Daten eines rekursiven Verfahrens zu halten, gibt es mehrere Wahlen; die hohe Instruktion nimmt ein Argument der nistenden Tiefe des Verfahrens sowie ein lokales Größe-Argument und kann schneller sein als ausführlichere Manipulation der Register (solcher als, Größe), aber es wird allgemein nicht verwendet. Ob es schneller ist, hängt von der besonderen x86 Durchführung (d. h. Verarbeiter) sowie die Benennen-Tagung ab, und Code, der beabsichtigt ist, um auf vielfachen Verarbeitern zu laufen, wird gewöhnlich schneller auf den meisten Zielen ohne es laufen.

Die volle Reihe, Weisen (einschließlich des unmittelbaren und base+offset) sogar für Instruktionen solcher als zu richten, und, macht direkten Gebrauch des Stapels für die ganze Zahl, Punkt und Adressdaten einfach schwimmen lassend, sowie die ABI Spezifizierungen und Mechanismen relativ einfach im Vergleich zu einigen RISC Architekturen haltend (verlangen Sie ausführlichere Anruf-Stapel-Details).

Ganze Zahl ALU Instruktionen

X86-Zusammenbau hat die mathematischen Standardoperationen, damit; die logischen Maschinenbediener; Bitshift-Arithmetik und logisch,/,/; rotieren Sie damit, und ohne, tragen/,/, eine Ergänzung von BCD arithmetischen Instruktionen, und anderen.

Das Schwimmen von Punkt-Instruktionen

X86-Zusammenbau-Sprache schließt Instruktionen für eine Stapel-basierte Schwimmpunkt-Einheit ein. Sie schließen Hinzufügung, Subtraktion, Ablehnung, Multiplikation, Abteilung, Rest, Quadratwurzeln, Stutzung der ganzen Zahl, Bruchteil-Stutzung und Skala durch die Macht zwei ein. Die Operationen schließen auch Umwandlungsinstruktionen ein, die laden oder einen Wert auswendig in einigen der folgenden Formate versorgen können: Binäre codierte Dezimalzahl, ganze 32-Bit-Zahl, ganze 64-Bit-Zahl, 32 Bit, die Punkt, 64 Bit schwimmen lassen, die Punkt oder 80 Bit schwimmen lassen, die Punkt (nach dem Laden schwimmen lassen, wird der Wert zur zurzeit verwendeten Schwimmpunkt-Weise umgewandelt). x86 schließt auch mehrere transzendente Funktionen einschließlich des Sinus, des Kosinus, der Tangente, arctangent, exponentiation mit der Basis 2 und Logarithmen zu Basen 2, 10, oder e ein.

Das Stapel-Register, um Register-Format der Instruktionen aufzuschobern, ist gewöhnlich op * oder op *, der St. </Code>, wo zu gleichwertig ist, und * eines der 8 Stapel-Register (...,) ist. Wie die ganzen Zahlen ist der erste operand sowohl die erste Quelle operand als auch der Bestimmungsort operand. und sollte als das erste Tauschen der Quelle operands vor dem Durchführen der Subtraktion oder Abteilung ausgesucht werden. Die Hinzufügung, die Subtraktion, die Multiplikation, die Abteilung, der Laden und die Vergleich-Instruktionen schließen Instruktionsweisen ein, die die Spitze des Stapels knallen lassen werden, nachdem ihre Operation abgeschlossen ist. Also zum Beispiel führt die Berechnung durch, zieht dann von der Spitze des Stapels um, so machend, was das Ergebnis in der Spitze des Stapels darin war.

SIMD Instruktionen

Moderne x86 Zentraleinheiten enthalten SIMD Instruktionen, die größtenteils dieselbe Operation in der Parallele auf vielen in einem breiten SIMD-Register verschlüsselten Werten durchführen. Verschiedene Instruktionstechnologien unterstützen verschiedene Operationen auf verschiedenen Register-Seten, aber genommen als ganzer Ganzer (von MMX bis SSE4.2) schließen sie allgemeine Berechnung auf der ganzen Zahl ein oder Punkt-Arithmetik (Hinzufügung, Subtraktion, Multiplikation, Verschiebung, Minimierung, Maximierung, Vergleich, Abteilung oder Quadratwurzel) schwimmen lassend. Also zum Beispiel, führt 4 parallele 16 Bit durch (angezeigt durch) ganze Zahl fügt (angezeigt durch) Werte dazu hinzu und versorgt das Ergebnis darin. SSE schließt auch eine Schwimmpunkt-Weise ein, in der nur der allererste Wert der Register wirklich (ausgebreitet in SSE2) modifiziert wird. Einige andere ungewöhnliche Instruktionen sind einschließlich einer Summe von absoluten Unterschieden hinzugefügt worden (verwendet für die Bewegungsbewertung in der Videokompression, solcher, die in MPEG getan wird) und 16 Bit Anhäufungsinstruktion (nützlich für das softwarebasierte Alpha-Mischen und die Digitalentstörung) multiplizieren. SSE (seit SSE3) und 3DNow! Erweiterungen schließen Hinzufügung und Subtraktionsinstruktionen ein, um paarweise angeordnete Schwimmpunkt-Werte wie komplexe Zahlen zu behandeln.

Diese Befehlssätze schließen auch zahlreiche feste Subwortinstruktionen für das Schlurfen, Einfügen und Extrahieren der Werte ringsherum innerhalb der Register ein. Außerdem gibt es Instruktionen für bewegende Daten zwischen den Registern der ganzen Zahl und XMM (verwendet in SSE)/FPU (verwendet in MMX) Register.

Datenmanipulationsinstruktionen

Der x86 Verarbeiter schließt auch komplizierte Wenden-Weisen ein, um Gedächtnis mit einem unmittelbaren Ausgleich, einem Register, einem Register mit einem Ausgleich, einem schuppigen Register mit oder ohne einen Ausgleich, und ein Register mit einem fakultativen Ausgleich und ein anderes schuppiges Register zu richten. So zum Beispiel kann man verschlüsseln wie eine einzelne Instruktion, die 32 Bit von Daten von der geschätzten wie ausgeglichenen Adresse vom Auswählenden lädt, und sie zum Register versorgt. In allgemeinen x86 Verarbeitern kann laden und Gedächtnis verwenden, das an der Größe jedes Registers verglichen ist, auf dem es funktioniert. (Die SIMD Instruktionen schließen auch Halbladeanweisungen ein.)

Der x86 Befehlssatz schließt Schnur-Last, Laden ein, bewegen Sie, scannen Sie und vergleichen Sie Instruktionen (und), die jede Operation für eine angegebene Größe (für 8-Bit-Byte, für 16-Bit-Wort, für doppeltes 32-Bit-Wort) dann Zunahme/Verminderung (abhängig von DF, Richtungsfahne) das implizite Adressregister (für, für und, und sowohl für als auch) durchführen. Für die Last, den Laden und die Ansehen-Operationen, ist das implizite Register des Ziels/Quelle/Vergleichs in, oder Register (abhängig von Größe). Die impliziten verwendeten Segment-Register sind für und für. Oder Register wird als ein Decrementing-Schalter und der Operationshalt verwendet, wenn der Schalter Null erreicht, oder (für das Ansehen und die Vergleiche), wenn Ungleichheit entdeckt wird.

Der Stapel wird mit implizit decrementing (Stoß) durchgeführt, und erhöhend (lassen) Stapel-Zeigestock (knallen). In 16-Bit-Weise wird dieser implizite Stapel-Zeigestock als SS gerichtet: [SP] in 32-Bit-Weise ist es SS: [BESONDERS], und in 64-Bit-Weise ist es [RSP]. Der Stapel-Zeigestock weist wirklich zum letzten Wert hin, der unter der Annahme versorgt wurde, dass seine Größe die Betriebsweise des Verarbeiters (d. h., 16, 32, oder 64 Bit) vergleichen wird, um die Verzug-Breite der///Instruktionen zu vergleichen. Auch eingeschlossen sind die Instruktionen, und die vorbestellen und Daten von der Spitze des Stapels entfernen, während sie einen Stapel-Rahmenzeigestock in//aufstellen. Jedoch, direkte Einstellung, oder Hinzufügung und Subtraktion zu//Register wird auch unterstützt, so / sind Instruktionen allgemein unnötig.

Dieser Code am Anfang einer Funktion:

stoßen Sie ebp; sparen Sie Benennen-Funktionsstapel-Rahmen (ebp)

mov ebp, besonders; lassen Sie einen neuen Stapel sich oben auf dem Stapel unseres Anrufers entwickeln

U-Boot besonders, 4; teilen Sie 4 Bytes des Stapel-Raums für die lokalen Variablen dieser Funktion zu

... ist zu gerade funktionell gleichwertig:

gehen Sie 4, 0 herein

Andere Instruktionen, für den Stapel zu manipulieren, schließen / ein, um das (E) FAHNE-Register zu versorgen und wiederzubekommen. / werden Instruktionen versorgen und den kompletten Register-Staat der ganzen Zahl zu und vom Stapel wiederbekommen.

Wie man

annimmt, sind Werte für eine SIMD-Last oder Laden in angrenzenden Positionen für das SIMD-Register gepackt und werden sie im folgenden ausrichten wenig-endian bestellen. Eine SSE-Last und Lager-Instruktionen verlangen, dass 16-Byte-Anordnung richtig fungiert. Die SIMD Befehlssätze schließen auch "Vorabruf"-Instruktionen ein, die die Last durchführen, aber kein Register ins Visier nehmen, das für das Laden des geheimen Lagers verwendet ist. Die SSE Befehlssätze schließen auch nichtzeitliche Lager-Instruktionen ein, die Läden gerade für das Gedächtnis durchführen werden ohne zu leisten, ein geheimes Lager teilen zu, wenn der Bestimmungsort nicht bereits versteckt wird (sonst, wird es sich wie ein regelmäßiger Laden benehmen.)

Der grösste Teil allgemeinen ganzen Zahl und Punkt (aber kein SIMD) Instruktionen schwimmen lassend, kann einen Parameter als eine komplizierte Adresse als der zweite Quellparameter verwenden. Instruktionen der ganzen Zahl können auch einen Speicherparameter als ein Bestimmungsort operand akzeptieren.

Programm-Fluss

Der x86 Zusammenbau hat eine vorbehaltlose Sprung-Operation, der eine unmittelbare Adresse nehmen kann, ein Register oder eine indirekte Adresse als ein Parameter (bemerken Sie, dass die meisten RISC Verarbeiter nur ein Verbindungsregister oder kurze unmittelbare Versetzung unterstützen, um zu springen).

Auch unterstützt sind mehrere bedingte Sprünge, einschließlich (Sprung auf der Null), (Sprung auf der Nichtnull), (Sprung auf dem größeren als, unterzeichnet), (Sprung auf weniger als, unterzeichnet), (Sprung auf dem obengenannten als, nicht unterzeichnet), (Sprung auf unten/weniger als, nicht unterzeichnet). Diese bedingten Operationen basieren auf dem Staat von spezifischen Bit im (E) FAHNE-Register. Viele arithmetische und Logikoperationen setzen, klären oder ergänzen diese Fahnen abhängig von ihrem Ergebnis. Der Vergleich (vergleicht sich), und Instruktionen setzen die Fahnen, als ob sie eine Subtraktion oder einen bitwise UND Operation beziehungsweise durchgeführt hatten, ohne die Werte des operands zu verändern. Es gibt auch Instruktionen solcher als (klar tragen Fahne), und (Ergänzung tragen Fahne), die an den Fahnen direkt arbeiten. Schwimmpunkt-Vergleiche werden über oder Instruktionen durchgeführt, die schließlich zu Fahnen der ganzen Zahl umgewandelt werden müssen.

Jede Sprung-Operation hat drei verschiedene Formen abhängig von der Größe des operand. Ein kurzer Sprung verwendet unterzeichneten operand von 8 Bit, der ein Verhältnisausgleich aus der aktuellen Instruktion ist. Ein naher Sprung ist einem kurzen Sprung ähnlich, aber verwendet unterzeichneten operand von 16 Bit (in der echten oder geschützten Weise), oder 32 Bit haben unterzeichnet operand (in 32 Bit hat Weise geschützt nur). Ein weiter Sprung ist derjenige, der das volle Segment base:offset Wert als eine absolute Adresse verwendet. Es gibt auch indirekte und mit einem Inhaltsverzeichnis versehene Formen von jedem von diesen.

Zusätzlich zu den einfachen Sprung-Operationen gibt es (nennen Sie ein Unterprogramm), und (Rückkehr vom Unterprogramm) Instruktionen. Vor der überwechselnden Kontrolle zum Unterprogramm, stößt die Segment-Ausgleich-Adresse der Instruktion im Anschluss an auf den Stapel; Knalle dieser Wert vom Stapel und Sprünge dazu, effektiv den Fluss der Kontrolle zu diesem Teil des Programms zurückgebend. Im Fall von a wird die Segment-Basis im Anschluss an den Ausgleich gestoßen; lässt den Ausgleich und dann die Segment-Basis knallen, um zurückzukehren.

Es gibt auch zwei ähnliche Instruktionen, (Unterbrechung), die den Strom (E) FAHNE-Register-Wert auf dem Stapel dann spart, führt a durch, außer dass statt einer Adresse es einen Unterbrechungsvektoren, einen Index in einen Tisch von Unterbrechungsdressierer-Adressen verwendet. Gewöhnlich spart der Unterbrechungsdressierer alle anderen Zentraleinheitsregister, die es verwendet, wenn sie nicht verwendet werden, um das Ergebnis einer Operation zum Benennen-Programm (in der Software genannt Unterbrechungen) zurückzugeben. Die zusammenpassende Rückkehr aus der Unterbrechungsinstruktion ist, der die Fahnen nach dem Zurückbringen wieder herstellt. Weiche Unterbrechungen des Typs, der oben beschrieben ist, werden durch einige Betriebssysteme für Systemanrufe verwendet, und können auch im Beseitigen bei harten Unterbrechungsdressierern verwendet werden. Harte Unterbrechungen werden durch Außenhardware-Ereignisse ausgelöst, und müssen alle Register-Werte bewahren, weil der Staat des zurzeit Durchführungsprogramms unbekannt ist. In der Geschützten Weise können Unterbrechungen durch den OS aufgestellt werden, um einen Aufgabe-Schalter auszulösen, der alle Register der aktiven Aufgabe automatisch sparen wird.

Beispiele

"Hallo Welt!" Programm für DOS im MASM Stil-Zusammenbau

.model kleiner

.stack 100.

.data

msg DB 'Hallo Welt! $'

.code

Anfang:

mov ah, 09h; Zeigen Sie die Nachricht

Weide dx, msg

interne Nummer 21.

mov Axt, 4C00h; Begrenzen Sie den rechtskräftigen

interne Nummer 21.

enden Sie fangen an

</Quelle>

"Hallo Welt!" Programm für Windows im MASM Stil-Zusammenbau

verlangt, dass/coff 6.15 und frühere Versionen einschalten

.386

.model klein, c

.stack 100..data

msg DB "Hallo Welt!", 0

.code

includelib MSVCRT

extrn printf:near

extrn exit:near

öffentlicher wichtiger

wichtiger proc

stoßen Sie Ausgleich msg

rufen Sie printf

stoßen Sie 0

rufen Sie Ausgang

wichtiger endp

beenden Sie wichtigen

</Quelle>

"Hallo Welt!" Programm für Linux im NASM Stil-Zusammenbau

Dieses Programm Läufe in 32 Bit hat Weise geschützt.

bauen Sie: Nasm-f Elf-F sticht name.asm

Verbindung: Ld-o nennen name.o

In geschützter Weise von 64 Bit können Sie 64-Bit-Register verwenden (z.B rax statt eax, rbx statt ebx, usw.)

Auch Änderung "-f Elf" für "-f elf64" darin baut Befehl.

Abteilung.data; Abteilung für initialisierte Daten

str: DB 'Hallo Welt!', 0Ah; Nachrichtenschnur mit der Rotforelle der neuen Linie am Ende (10 Dezimalzahl)

str_len: Equ-$ - str; die Calcs-Länge der Schnur (Bytes) durch das Abziehen der Adresse von thi ($-Symbol) vom Anfang des str richtet

Abteilung.text; das ist die Codeabteilung

globaler _start; _start ist der Zugang-Punkt und braucht globales Spielraum, das durch den linker - gleichwertig zum wichtigen in C/C ++ 'zu sehen'

ist

_start:; Verfahren-Anfang

mov eax, 4; geben Sie den Sys_write-Funktionscode (vom OS Vektor-Tisch) an

mov ebx, 1; geben Sie Dateideskriptor stdout - in linux an, alles wird als eine Datei, sogar Hardware-Geräte behandelt

mov ecx, str; bewegen Sie sich Anfang _address_ der Schnur-Nachricht an ecx schreiben ein

mov edx, str_len; bewegen Sie Länge der Nachricht (in Bytes)

interne Nummer 80.; sagen Sie Kern, den Systemanruf durchzuführen, den wir gerade - in linux Dienstleistungen aufstellen, werden durch den Kern gebeten

mov eax, 1; geben Sie Sys_exit-Funktionscode (vom OS Vektor-Tisch) an

mov ebx, 0; geben Sie Rückcode für OS an (0 = alles ist fein)

interne Nummer 80.; sagen Sie Kern, Systemanruf durchzuführen

</Quelle>

drucken Sie "/bin/sh\n" Programm in 64 - Bit-Weise Linux

Abteilung.text

globaler _start, schreiben Sie

schreiben Sie:

mov al, 1; schreiben Sie syscall

syscall

rösten Sie

_start:

mov rax, 0x0a68732f6e69622f;/bin/sh\n

stoßen Sie rax

xor rax, rax

mov rsi, rsp

mov rdi, 1

mov rdx, 8

rufen Sie schreiben Sie

Ausgang:; Herrschen Sie gerade nicht über eine Funktion

xor rax, rax

mov rax, 60

syscall</Quelle>

Das Verwenden des Fahne-Registers

Fahnen werden für Vergleiche in der x86 Architektur schwer verwendet. Wenn ein Vergleich zwischen zwei Daten gemacht wird, setzt die Zentraleinheit die relevante Fahne oder Fahnen. Im Anschluss daran können bedingte Sprung-Instruktionen verwendet werden, um die Fahnen und den Zweig zu überprüfen, um zu codieren, der z.B laufen sollte:

cmp eax, ebx

jne do_something

;...

do_something:

; tun Sie etwas hier

</Quelle>

Fahnen werden auch in der x86 Architektur verwendet, um sich zu drehen, und von bestimmten Eigenschaften oder Ausführungsweisen. Zum Beispiel, um die Verarbeitung von Unterbrechungen unbrauchbar zu machen, können Sie den Befehl verwenden:

cli

</Quelle>

Auf das Fahne-Register kann auch direkt zugegriffen werden. Die niedrigen 8 Bit des Flagregisters können ins Verwenden der Instruktion geladen werden. Das komplette Fahne-Register kann auch vorwärtsgetrieben werden und vom Stapel mit den Instruktionen, (einschließlich) und.

Das Verwenden des Instruktionszeigestock-Registers

Der Instruktionszeigestock wird 16-Bit-Weise, in 32-Bit-Weise, und in 64-Bit-Weise herbeigerufen. Das Instruktionszeigestock-Register weist zur Speicheradresse hin, die der Verarbeiter als nächstes versuchen wird durchzuführen; darauf kann in 16-bit- oder 32-Bit-Weise nicht direkt zugegriffen werden, aber eine Folge wie der folgende kann geschrieben werden, um die Adresse zu stellen, in:

rufen Sie next_line

next_line:

Knall eax

</Quelle>

Das arbeitet sogar im mit der Position unabhängigen Code, weil einen mit der Instruktion mit dem Zeigestock relativen unmittelbaren operand nimmt.

Das Schreiben zum Instruktionszeigestock ist — Befehlssätze der Instruktionszeigestock zur Zieladresse einfach, so, zum Beispiel, wird eine Folge wie der folgende den Inhalt stellen in:

jmp eax

</Quelle>

In 64-Bit-Weise können Instruktionen in Daten hinsichtlich des Instruktionszeigestocks Verweise anbringen, also gibt es weniger Bedürfnis, den Wert des Instruktionszeigestocks zu einem anderen Register zu kopieren.

Siehe auch

Links

Handbücher


Rucksacktourist / Geldmengenpolitik Schwedens
Impressum & Datenschutz