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 verwendet
IMUL/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 von
CLDDanach 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.