Schnellreferenz für Assemblerbefehle

Dieser Artikel konzentriert sich auf die gängigste x86-Architektur-Assemblersprache und ordnet gängige Befehlsmnemonics zur einfachen Lerninhaltsfindung und schnellen Nachschlagung nach Funktion an.

Befehlsmnemonics sind über verschiedene Assembler (MASM, NASM, GAS) hinweg im Wesentlichen gleich, mit nur geringfügigen Unterschieden in der Operandenformatierung.

Übersicht über neun Hauptbefehlskategorien:

Kategorie Anzahl der Befehle Hauptzweck
Datentransferbefehle 15 Befehle Daten zwischen Registern, Speicher und E/A-Ports verschieben
Arithmetische Operationen 18 Befehle Addition, Subtraktion, Multiplikation, Division, Vergleich und dezimale Anpassung
Logische Operationen und Schiebebefehle 14 Befehle Bitweises UND, ODER, NICHT, XOR, Schiebungen und Rotation
String-Operationsbefehle 8 Befehle Zusammenhängende Speicherbereiche verarbeiten, verwendet mit Wiederholungspräfixen für Batch-Operationen
Steuerflussbefehle 30+ Befehle Sprünge, Schleifen, Prozeduraufrufe und Interrupts
Bedingte Setzbefehle 16 Befehle Byte-Werte basierend auf Flag-Bits setzen, zur Vermeidung von Verzweigungen
Ein-/Ausgabebefehle 4 Befehle E/A-Ports lesen und beschreiben
Prozessorsteuerungsbefehle 14 Befehle Steuer-Flag-Bits, Synchronisation und Systemverwaltung
Gleitkomma-Befehle (x87 FPU) 14 Befehle Traditionelle x87-Gleitkomma-Stack-Operationen

Datentransferbefehle

Datentransferbefehle sind der grundlegendste Befehlstempo und dafür verantwortlich, Daten zwischen Registern, Speicher und E/A-Ports zu bewegen.

Die meisten Transferbefehle beeinflussen keine Flag-Bits (außer SAHF und POPF).

Mnemonic Kurzbeschreibung
MOV Kopiere den Quelloperanden in den Zieloperanden; unterstützt Register-zu-Register, Register-zu-Speicher sowie Sofortwert-zu-Register oder Sofortwert-zu-Speicher
MOVSX Verschieben mit Vorzeichenerweiterung, erweitert einen kleineren Operanden auf eine größere Größe (z. B. Byte zu Doppelwort, füllt die oberen Bits mit dem Vorzeichenbit)
MOVZX Verschieben mit Nullerweiterung, füllt die oberen Bits mit 0 (wird für vorzeichenlose Erweiterung verwendet)
PUSH Lege einen Operanden auf den Stack; der Stack-Zeiger ESP/RSP wird automatisch dekrementiert (erst dekrementieren, dann speichern)
POP Hole Daten vom Stack in den Zieloperanden; der Stack-Zeiger wird automatisch inkrementiert (erst holen, dann inkrementieren)
PUSHA / PUSHAD Lege alle Allzweckregister auf den Stack (PUSHA für 16-Bit, PUSHAD für 32-Bit); wird häufig verwendet, um den aktuellen Kontext zu sichern
POPA / POPAD Stelle alle Allzweckregister vom Stack wieder her, symmetrisch zu PUSHA/PUSHAD verwendet
XCHG Tausche den Inhalt von zwei Operanden aus; mindestens ein Operand muss ein Register sein
LEA Lade effektive Adresse, speichert die Adresse des Quelloperanden anstelle des Speicherinhalts im Zielregister; wird häufig für Zeigerberechnungen verwendet
LDS / LES / LFS / LGS / LSS Lade einen Far-Pointer in Segmentregister und Allzweckregister (wird in modernen Flat-Memory-Modellen seltener verwendet)
LAHF Lade die unteren 8 Bits des Flag-Registers in das AH-Register
SAHF Speichere den Inhalt von AH zurück in die unteren 8 Bits des Flag-Registers
PUSHF / PUSHFD Lege das Flag-Register auf den Stack (PUSHF für 16-Bit, PUSHFD für 32-Bit)
POPF / POPFD Stelle das Flag-Register vom Stack wieder her
XLAT / XLATB Tabellennachschlage-Übersetzungsbefehl; sendet das Speicherbyte, das dem Indexwert in AL entspricht, nach AL, wobei BX/EBX auf die Tabellenbasisadresse zeigt

LEAundMOVDer Hauptunterschied zwischenLEA REG, [ADDR]undMOV REG, [ADDR]ist, dass Ersterer den Adresswert selbst lädt, während Letzterer den Speicherinhalt an dieser Adresse lädt. Bei der Durchführung von Adressberechnungen (wieLEA EAX, [EBX+4*ECX+8]) ist LEA sehr effizient.


Arithmetische Operationen

Arithmetische Befehle führen Addition, Subtraktion, Multiplikation, Division und Vergleiche durch; die Ausführungsergebnisse beeinflussen direkt die relevanten Flag-Bits im Flag-Register.

Programmierer bestimmen das Ergebnis einer Operation in der Regel anhand des Zero-Flags (ZF), Carry-Flags (CF), Sign-Flags (SF) und Overflow-Flags (OF).

Mnemonic Kurzbeschreibung der Funktion
ADD Addition, dest = dest + source, beeinflusst Flags wie OF, SF, ZF, CF.
ADC Addieren mit Übertrag, dest = dest + source + CF, wird für Arithmetik mit höherer Präzision verwendet.
SUB Subtraktion, dest = dest - source.
SBB Subtrahieren mit Borg (Borrow), dest = dest - source - CF, wird zusammen mit ADC für Operationen mit höherer Präzision verwendet.
INC Operand um 1 inkrementieren, beeinflusst das CF-Flag nicht.
DEC Operand um 1 dekrementieren, beeinflusst das CF-Flag nicht.
MUL Unvorzeichenbehaftete Multiplikation, Multiplikand in AL/AX/EAX, Produkt wird in AX/DX:AX/EDX:EAX gespeichert.
IMUL Vorzeichenbehaftete Multiplikation, unterstützt drei Formen: Ein-Operand, Zwei-Operand und Drei-Operand.
DIV Unvorzeichenbehaftete Division, Dividend in AX/DX:AX/EDX:EAX, Quotient und Rest werden in angegebenen Registern gespeichert.
IDIV Vorzeichenbehaftete Division, ähnlich wie DIV, handhabt jedoch Vorzeichen.
CMP Zwei Operanden vergleichen, führt eine Subtraktion durch, ohne das Ergebnis zu speichern, beeinflusst nur Flags (wird typischerweise gefolgt von einem bedingten Sprung).
NEG Negieren, invertiert den Operanden und addiert 1, entspricht 0 minus dem Operanden.
DAA Dezimalkorrektur nach Addition, korrigiert AL in das gepackte BCD-Format.
DAS Dezimalkorrektur nach Subtraktion.
AAA ASCII-Korrektur nach Addition, für ungepacktes BCD.
AAS ASCII-Korrektur nach Subtraktion.
AAM ASCII-Korrektur nach Multiplikation.
AAD ASCII-Korrektur vor Division.
CBW / CWDE Vorzeichenerweiterung: CBW erweitert das Vorzeichen von AL auf AX, CWDE erweitert das Vorzeichen von AX auf EAX.
CWD / CDQ Vorzeichenerweiterung: CWD erweitert AX auf DX:AX, CDQ erweitert EAX auf EDX:EAX (wird oft verwendet, um den Dividenden vor einer Division vorzubereiten).

Wird für vorzeichenbehaftete Operationen verwendetIMUL / IDIV, wird für unvorzeichenbehaftete Operationen verwendetMUL / DIV. Die Wahl der falschen Anweisung führt zu inkorrekten Ergebnissen – beispielsweise repräsentiert derselbe Binärwert unterschiedliche numerische Werte unter vorzeichenbehafteter und unvorzeichenbehafteter Interpretation.


Logische Operationen und Schiebebefehle

Diese Anweisungen führen bitweise logische Operationen wie AND, OR, NOT, XOR sowie Shifts und Rotationen durch.

Shift-Operationen werden häufig für schnelle Multiplikation/Division durch Zweierpotenzen, Bitfeld-Extraktion und Bitmaskierungsoperationen verwendet.

Mnemonic Kurzbeschreibung der Funktion
AND Bitweises AND, wird oft für Maskierung verwendet (Löschen spezifischer Bits).
OR Bitweises OR, wird oft verwendet, um spezifische Bits zu setzen.
XOR Bitweises XOR, gleiche Bits ergeben 0, unterschiedliche Bits ergeben 1. XOR REG, REG ist ein klassischer, effizienter Weg, ein Register zu löschen.
NOT Bitweises NOT, kippt alle Bits um.
TEST Bits testen, führt ein AND durch, ohne das Ergebnis zu speichern, beeinflusst nur Flags (wird oft verwendet, um zu prüfen, ob ein bestimmtes Bit 0 ist).
SHL / SAL Logischer Linksschub / arithmetischer Linksschub, beide verhalten sich identisch, niedrige Bits werden mit 0 aufgefüllt, hohe Bits werden in das CF verschoben.
SHR Logischer Rechtsschub, hohe Bits werden mit 0 aufgefüllt, niedrige Bits werden in das CF verschoben (für unvorzeichenbehaftete Zahlen).
SAR Arithmetischer Rechtsschub, hohe Bits werden mit dem ursprünglichen Vorzeichenbit aufgefüllt, wodurch das Vorzeichen der Zahl erhalten bleibt (für vorzeichenbehaftete Zahlen).
ROL Nach links rotieren, herausgeschobene Bits werden auf der anderen Seite wieder hineingebracht.
ROR Nach rechts rotieren, herausgeschobene Bits werden auf der anderen Seite wieder hineingebracht.
RCL Nach links rotieren über Carry, CF nimmt an der Rotation teil (CF fungiert als temporäres Speicherbit).
RCR Nach rechts rotieren über Carry, CF nimmt an der Rotation teil.
SHLD Doppelt präziser Linksschub, verschiebt Ziel- und Quelloperand zusammen nach links, Ergebnis wird im Ziel gespeichert.
SHRD Doppelt präziser Rechtsschub, verschiebt Ziel- und Quelloperand zusammen nach rechts, Ergebnis wird im Ziel gespeichert.

XOR REG, REGist der optimale Weg, ein Register zu löschen – der generierte Maschinencode istMOV REG, 0kürzer und zudem schneller.


String-Operationsbefehle

String-Anweisungen verarbeiten speziell zusammenhängende Speicherbereiche und werden mit Wiederholungspräfixen verwendet, üblicherweise für Massenoperationen wie Array-Kopieren, Speichervergleich und Puffersuche.

Die Quelladresse dieser Anweisungen wird standardmäßig durchDS:ESIund die Zieladresse durchES:EDIangezeigt.

Mnemonic Kurzbeschreibung der Funktion
MOVS String verschieben, kopiert [DS:ESI] nach [ES:EDI] und aktualisiert ESI, EDI automatisch. Unterteilt nach Operandengröße in MOVSB (Byte), MOVSW (Word), MOVSD (Doubleword).
STOS String speichern, speichert AL/AX/EAX in [ES:EDI] und aktualisiert EDI. Wird oft verwendet, um einen Speicherbereich mit demselben Wert zu initialisieren.
LODS String laden, lädt AL/AX/EAX von [DS:ESI] und aktualisiert ESI. Wird seltener verwendet, da es jeweils nur einen Wert in den Akkumulator lädt.
CMPS String vergleichen: vergleicht [DS:ESI] mit [ES:EDI] und beeinflusst Flags. Wird normalerweise mit REPE/REPNE verwendet, um nach übereinstimmenden oder nicht übereinstimmenden Positionen zu suchen.
SCAS String durchsuchen: vergleicht AL/AX/EAX mit [ES:EDI] und aktualisiert EDI. Wird häufig verwendet, um nach einem spezifischen Wert im Speicher zu suchen.
REP Wiederholungspräfix: wiederholt die folgende String-Anweisung, solange ECX ≠ 0 ist, und ECX wird nach jeder Ausführung automatisch um 1 dekrementiert.
REPE / REPZ Wiederholen, solange gleich/Null: wird fortgesetzt, solange ECX ≠ 0 und ZF = 1 ist (wird normalerweise mit CMPS und SCAS verwendet, um nach Übereinstimmungen zu suchen).
REPNE / REPNZ Wiederholen, solange ungleich/nicht Null: wird fortgesetzt, solange ECX ≠ 0 und ZF = 0 ist (wird verwendet, um nach nicht übereinstimmenden Elementen zu suchen).

Richtungs-FlagDFSteuert die Bewegungsrichtung von String-Operationszeigern: Ausführen vonCLDDanach ist DF=0, Zeiger inkrementieren (Vorwärtsverarbeitung); Ausführen vonSTDDanach ist DF=1, Zeiger dekrementieren (Rückwärtsverarbeitung). Vor der Verwendung von String-Operationen sollte DF explizit gesetzt werden; man sollte sich nicht auf den Standardwert verlassen.


Steuerflussbefehle

Steuerungsübertragungsanweisungen ändern den Ablauf der Programmausführung, einschließlich unbedingter Sprünge, bedingter Sprünge, Schleifen sowie Prozeduraufrufen und -rücksprüngen.

Dies ist das Fundament für die Implementierung von Programmlogikverzweigungen, Schleifen und Funktionsaufrufen.

Unbedingte Sprünge und Aufrufe

Ein unbedingter Sprung prüft keine Bedingung; er ändert direkt den Wert von EIP/RIP und veranlasst die CPU, die Ausführung von der neuen Adresse aus fortzusetzen.

Mnemonic Kurze Funktionsbeschreibung
JMP Unbedingter Sprung, unterstützt kurzen Sprung (-128 bis +127 Bytes), nahen Sprung (innerhalb des Segments) und fernen Sprung (segmentübergreifend).
CALL Ruft eine Prozedur auf: legt zuerst die Rücksprungadresse auf dem Stapel (Stack) ab und springt dann zur Zieladresse.
RET / RETF Kehrt von einer Prozedur zurück. RET wird für einen nahen Rücksprung (innerhalb des Segments) verwendet, RETF für einen fernen Rücksprung (segmentübergreifend). Ein unmittelbarer Operand kann eingeschlossen werden, um auch den Parameterbereich auf dem Stack freizugeben.

Bedingte Sprünge

Bedingte Sprünge bestimmen basierend auf dem Wert spezifischer Flag-Bits im Flag-Register, ob gesprungen wird.

Wird normalerweise unmittelbar nachCMPoderTESTder Anweisung verwendet.

Mnemonic Sprungbedingung Typische Verwendung
JE / JZ ZF = 1 (gleich / Null) Springen bei Gleichheit nach CMP
JNE / JNZ ZF = 0 (ungleich / nicht Null) Springen bei Ungleichheit nach CMP
JS SF = 1 (Ergebnis ist negativ) Springen, wenn das Operationsergebnis negativ ist
JNS SF = 0 (Ergebnis ist positiv) Springen, wenn das Operationsergebnis nicht negativ ist
JC CF = 1 (Übertrag / Borchritt) Springen bei kleiner als in einem Vorzeichenlosen Vergleich; entspricht JB
JNC CF = 0 (kein Übertrag / Borchritt) Springen bei größer als oder gleich in einem Vorzeichenlosen Vergleich; entspricht JAE
JO OF = 1 (Überlauf) Springen, wenn eine Operation mit Vorzeichen einen Überlauf erzeugt
JNO OF = 0 (kein Überlauf) Springen, wenn eine Operation mit Vorzeichen keinen Überlauf erzeugt
JP / JPE PF = 1 (die Anzahl der 1en in den unteren 8 Bits ist gerade) Springen, wenn die Parität gerade ist
JNP / JPO PF = 0 (die Anzahl der 1en ist ungerade) Springen, wenn die Parität ungerade ist
JA / JNBE CF = 0 und ZF = 0 Vorzeichenlos größer als (Above)
JAE / JNB CF = 0 Vorzeichenlos größer als oder gleich (Above or Equal)
JB / JNAE CF = 1 Vorzeichenlos kleiner als (Below)
JBE / JNA CF = 1 oder ZF = 1 Vorzeichenlos kleiner als oder gleich (Below or Equal)
JG / JNLE ZF = 0 und SF = OF Mit Vorzeichen größer als (Greater)
JGE / JNL SF = OF Mit Vorzeichen größer als oder gleich (Greater or Equal)
JL / JNGE SF ≠ OF Mit Vorzeichen kleiner als (Less)
JLE / JNG ZF = 1 oder SF ≠ OF Mit Vorzeichen kleiner als oder gleich (Less or Equal)
JCXZ Springen, wenn CX = 0 Bestimmen, ob CX im 16-Bit-Modus Null ist
JECXZ Springen, wenn ECX = 0 Bestimmen, ob ECX im 32-Bit-Modus Null ist

Vorzeichenlose und vorzeichenbehaftete Vergleiche verwenden unterschiedliche Sprungbefehle; dies ist die häufigste Fehlerquelle für Anfänger. Zum Beispiel beim Vergleich zweier Zahlen,JAprüft auf vorzeichenlos größer als,JGprüft auf mit Vorzeichen größer als – dasselbe CMP-Ergebnis kann zwischen diesen beiden Beurteilungen unterschiedlich sein.

Schleifenbefehle

Schleifenbefehle verwenden ECX als Zähler, der bei jeder Iteration automatisch dekrementiert wird, um zu bestimmen, ob die Schleife fortgesetzt werden soll.

Mnemonic Funktionsbeschreibung
LOOP Dekrementiere ECX um 1, wenn ECX ≠ 0, springe zur Zieladresse
LOOPE / LOOPZ Dekrementiere ECX um 1, wenn ECX ≠ 0 und ZF = 1, springe (Schleife bei Gleichheit fortsetzen)
LOOPNE / LOOPNZ Dekrementiere ECX um 1, wenn ECX ≠ 0 und ZF = 0, springe (Schleife bei Ungleichheit fortsetzen)

Interrupts und Rücksprünge

Mnemonic Funktionsbeschreibung
INT n Software-Interrupt, ruft die Interrupt-Serviceroutine mit der Interrupt-Vektornummer n auf (z. B. INT 21h unter DOS ist ein Systemfunktionsaufruf)
INTO Überlauf-Interrupt, ruft INT 4 auf, wenn OF = 1 (wird verwendet, um arithmetische Überlaufausnahmen abzufangen)
IRET / IRETD Rückkehr von der Interrupt-Serviceroutine unter Wiederherstellung des EFLAGS-Registers und der Rücksprungadresse zum Zeitpunkt des Interrupts

Bedingte Setzbefehle

Befehle zum bedingten Setzen (unterstützt ab 386-Prozessoren) setzen das Zielbyte basierend auf dem Zustand der Flag-Bits auf 1 oder 0.

Diese Befehle werden häufig verwendet, um Verzweigungssprünge zu eliminieren und die Codeausführungseffizienz zu verbessern – die Verwendung des bedingten Setzens anstelle von kurzen Verzweigungen kann die Leistungseinbußen durch Fehlvorhersagen bei der Sprungvorhersage vermeiden.

Mnemonic Bedingung setzen Äquivalente Semantik
SETZ / SETE ZF = 1 Setzen, wenn gleich / Ergebnis ist Null
SETNZ / SETNE ZF = 0 Setzen, wenn ungleich / Ergebnis ist nicht Null
SETC CF = 1 Setzen, wenn ein Übertrag/Borchritt vorliegt
SETNC CF = 0 Setzen, wenn kein Übertrag/Borchritt vorliegt
SETO OF = 1 Setzen, wenn ein Überlauf vorliegt
SETNO OF = 0 Setzen, wenn kein Überlauf vorliegt
SETS SF = 1 Setzen, wenn das Ergebnis negativ ist
SETNS SF = 0 Setzen, wenn das Ergebnis positiv ist
SETG / SETNLE ZF=0 und SF=OF Setzen, wenn mit Vorzeichen größer als
SETGE / SETNL SF = OF Setzen, wenn mit Vorzeichen größer als oder gleich
SETL / SETNGE SF ≠ OF Setzen, wenn mit Vorzeichen kleiner als
SETLE / SETNG ZF=1 oder SF≠OF Setzen, wenn mit Vorzeichen kleiner als oder gleich
SETA / SETNBE CF=0 und ZF=0 Setzen, wenn vorzeichenlos größer als
SETAE / SETNB CF = 0 Setzen, wenn vorzeichenlos größer als oder gleich
SETB / SETNAE CF = 1 Setzen, wenn vorzeichenlos kleiner als
SETBE / SETNA CF=1 oder ZF=1 Setzen, wenn vorzeichenlos kleiner als oder gleich

CMP EAX, EBXgefolgt vonSETG ALhat die Wirkung: Wenn EAX mit Vorzeichen größer als EBX ist, wird AL auf 1 gesetzt, ansonsten auf 0. Dies istJG label; MOV AL, 1; JMP done; label: MOV AL, 0; done:prägnanter und effizienter.


Ein-/Ausgabebefehle

E/A-Befehle werden für den Datenaustausch zwischen der CPU und externen Geräteports verwendet.

In der x86-Architektur sind der Port-Adressraum und der Speicher-Adressraum unabhängig voneinander und müssen über dedizierte E/A-Befehle angesprochen werden.

Mnemonic Funktionsbeschreibung
IN Daten vom angegebenen Port in AL/AX/EAX lesen. Wenn die Portadresse 0-255 ist, kann ein unmittelbarer Wert direkt geschrieben werden; wenn sie 255 überschreitet, muss sie über das DX-Register angegeben werden
OUT Daten von AL/AX/EAX an den angegebenen Port schreiben. Die Port-Adressregeln entsprechen denen von IN
INS Ein Byte/Wort/Doppelwort von einem Port in den Speicher lesen, auf den ES:EDI zeigt, und EDI automatisch aktualisieren (ähnlich wie STOS, liest jedoch von E/A)
OUTS Das Byte/Wort/Doppelwort im Speicher, auf den DS:ESI zeigt, an einen Port ausgeben und ESI automatisch aktualisieren

In modernen Betriebssystemen (Windows, Linux) können Benutzermodus-Programme E/A-Befehle normalerweise nicht direkt ausführen – diese Befehle sind vom Betriebssystem nur für den Kernel-Modus zugelassen. In DOS-Umgebungen oder bei der Programmierung auf Bare-Metal-Ebene können sie frei verwendet werden.


Prozessorsteuerung und sonstige Befehle

Diese Befehle dienen der Steuerung des Betriebszustands des Prozessors, einschließlich Flag-Operationen, Synchronisationssteuerung und Abruf von Systeminformationen.

Mnemonic Funktionsbeschreibung
CLC Übertrag-Flag löschen, CF auf 0 setzen
STC Übertrag-Flag setzen, CF auf 1 setzen
CMC Übertrag-Flag invertieren, CF nimmt den gegenteiligen Wert an
CLD Rrichtungs-Flag löschen, DF auf 0 setzen, String-Operationszeiger automatisch inkrementieren
STD Direction-Flag setzen, DF auf 1 setzen, String-Operation-Zeiger werden automatisch dekrementiert
CLI Interrupt-Flag löschen, IF auf 0 setzen, maskierbare Hardware-Interrupts deaktivieren
STI Interrupt-Flag setzen, IF auf 1 setzen, maskierbare Hardware-Interrupts aktivieren
NOP Keine Operation (No-Operation), der Maschinencode ist 0x90, führt keine sinnvolle Operation aus. Wird oft für Befehlsausrichtung, Verzögerungspaddings oder zum Reservieren von Patch-Bereichen verwendet
HLT Anhalten (Halt), der Prozessor stoppt die Ausführung, bis er einen externen Interrupt oder ein Reset-Signal erhält
WAIT / FWAIT Warten, bis die FPU die aktuellen Operationen abgeschlossen hat, wird hauptsächlich zur Synchronisation mit dem x87-Coprozessor verwendet
LOCK Bus-Lock-Präfix, das bewirkt, dass der unmittelbar folgende Befehl atomar ausgeführt wird. Klassische Verwendung: LOCK XCHG implementiert Spinlocks, LOCK CMPXCHG implementiert CAS-Operationen.
CPUID CPU-Funktionsinformationen abrufen, einschließlich Anbieter-ID, unterstützter Befehlssatzerweiterungen usw. Vor dem Aufruf die Funktionsnummer in EAX setzen.
RDTSC Zeitstempelzähler lesen, den 64-Bit-Zählwert in EDX:EAX speichern, wird für hochpräzise Leistungsmessungen verwendet.

Gleitkommabefehle

Die folgenden sind traditionelle x87-FPU-Gleitkommabefehle, geeignet für Szenarien, die den Gleitkommastapel für wissenschaftliche Berechnungen verwenden.

In der modernen Programmierung haben SIMD-Befehlssätze wie SSE/SSE2 x87 schrittweise ersetzt, aber x87 wird beim Verstehen von Legacy-Code oder bei einfachen Gleitkommaarithmetikoperationen nach wie vor häufig verwendet.

Mnemonic Kurzbeschreibung
FLD Eine Gleitkommazahl aus dem Speicher auf die FPU-Stapelspitze ST(0) laden, der Stapelzeiger bewegt sich nach oben.
FST / FSTP Die Daten der Stapelspitze im Speicher speichern. FST nimmt kein Pop des Stapels vor, FSTP nimmt ein Pop des Stapels vor (Stapelzeiger bewegt sich nach unten).
FADD Gleitkommaaddition: ST(0) zum angegebenen Operanden addieren, das Ergebnis in ST(0) speichern.
FSUB Gleitkommasubtraktion: ST(0) minus den angegebenen Operanden.
FMUL Gleitkommamultiplikation
FDIV Gleitkommadivision: ST(0) geteilt durch den angegebenen Operanden.
FCOM / FCOMP ST(0) mit dem angegebenen Operanden vergleichen, den Bedingungscode im FPU-Statuswort setzen. FCOMP führt nach dem Vergleich ein Pop des Stapels durch.
FCHS Das Vorzeichen des Wertes in ST(0) ändern (positiv zu negativ, negativ zu positiv).
FSQRT Die Quadratwurzel von ST(0) berechnen, das Ergebnis in ST(0) speichern.
FSIN / FCOS Den Sinus / Kosinus von ST(0) berechnen (Argument in Bogenmaß), das Ergebnis in ST(0) speichern.
FPTAN Den Tangens von ST(0) berechnen.
FLD1 Die Konstante 1.0 auf die FPU-Stapelspitze legen.
FLDZ Die Konstante 0.0 auf die FPU-Stapelspitze legen.
FLDPI Die Konstante π (3.14159...) auf die FPU-Stapelspitze legen.

x87-FPU-NutzungGleitkomma-Registerstapel(ST(0) bis ST(7), insgesamt 8 80-Bit-Register) für Operationen. Vor der Verwendung auf die Stapeltiefenbegrenzung achten – das Ablegen von mehr als 2 Werten... nein, mehr als 8 Werten führt zu einer Stapelüberlaufausnahme.


Hinweise

  • Vorzeichenbehaftete und vorzeichenlose Befehle unterscheiden.MUL/IMUL, DIV/IDIV und die JG/JA-Serie bei bedingten Sprüngen entsprechen unterschiedlichen numerischen Interpretationen. Der Assembler prüft Typen nicht für Sie – die Verwendung des falschen Befehls führt stillschweigend zu inkorrekten Ergebnissen.

  • Achten Sie darauf, das DF-Flag vor String-Operationen zu setzen.Geben Sie die Richtung explizit mit CLD (Inkrement) oder STD (Dekrement) an. Verlassen Sie sich nicht auf den Standard. Der Standard-DF-Zustand kann zwischen Compilern und Aufrufkonventionen variieren.

  • Moderne Betriebssysteme schränken privilegierte Befehle ein.Befehle wie CLI/STI, HLT, IN/OUT verursachen Ausnahmen, wenn sie in Ring 3 (Benutzermodus) ausgeführt werden. Diese Befehle werden typischerweise nur in Betriebssystem-Kerneln oder Bare-Metal-Umgebungen verwendet.

  • Moderne Befehlssätze bevorzugen.In neuem Code werden bedingte Set-Befehle (SETcc) gegenüber bedingten Sprüngen bevorzugt (womit der Overhead der Sprungvorhersage beseitigt wird), und SSE/AVX-Befehle werden gegenüber x87 bevorzugt (bessere Leistung, einfacheres Programmiermodell). Der x87 und die in dieser Tabelle behandelten traditionellen Befehle dienen hauptsächlich dem Verständnis von Legacy-Code.

Weitere Erweiterungen