Überblick ARM 32-Bit Befehlssatz

Aus C und Assembler mit Raspberry

Hier gibt es eine Auflistung aller mir bekannten Befehlssätze für den ARM. Diese wurde von folgenden Seiten frei übersetzt und meiner Formatierung angepasst:

https://developer.arm.com/documentation/

Weitere Informationen sind:

Namenskonvention

In der folgenden Liste werden die einzelnen Befehle/Anweisungen beschrieben, die mir bekannt sind. Dazu wurden in den Unterkapiteln der jeweilige Befehl erklärt, was er macht und wie er benutzt werden kann. Jeder einzelne Befehl wird in folgende Abschnitte beschrieben:

  • Überschrift, der Name der Funktion
    • Kurzbeschreibung
  • Syntax
  • Parameter
  • Verwendung
  • Bedingungs-Flags
  • Beispiel

Überschrift

Die Überschrift bezeichnet den einzelnen Befehl, der im folgenden beschrieben wird.

Kurzbeschreibung

Dies beschreibt sehr kurz, was der jeweilige Befehl macht. Unter "Verwendung" wird dies genauer beschrieben.

Syntax

Dies beschreibt den Assemblercode, der für den Befehl verwendet wird. Dazu sind folgende Regeln zu beachten:

  • GROßBUCHSTABEN: Ist ein fester Bestandteil des Befehls
  • {}: Der Wert, innerhalb von {} ist ein optionaler Bestandteil des Codes.
  • a|b: Entweder, oder. Hier kann entweder "a" oder "b" angegeben werden.
  • #: Zeigt einen numerischen Wert an.

Parameter

Beschreibt die einzelnen Parameter, die dem Befehl übergeben werden.

Verwendung

Dies beschreibt textlich, wie der Befehl funktioniert. Bei manchen Befehlen wird auch versucht, dies Schematisch darzustellen.

Bedingungs-Flags

Manche Befehle setzen Bedingungsflags, die für weitere Befehle, die ein cond verwenden, bedingt ausführen. Dazu muss man wissen, wie diese Flags gesetzt werden.

Beispiel

Unter Beispiel wird gezeigt, wie dieser Befehl eingesetzt werden kann. Meist ist es ein Sourcecode-Schnipsel. Es wird versucht, ein kompilierbaren Code als Download bereitzustellen, um den Befehl zu veranschaulichen. Wie man diese Verwendet, kann unter Verwendung der ARM-Beispiele nachgeschlagen werden.

Register

In den Befehlsbeschreibungen wird Rx für Register verwendet. Solange wir uns im 32-Bit-Modus befinden, sind damit die Register R0 bis R12 gemeint. Im 64-Bit-Modus sind die Register X0 bis X30 als 64-Bitregister und W0 bis W30 als 32-Bitregister anzusehen.

Liste des ARM-Befehlssatzes

Befehlssatz
Symbol Anweisung Aktion Siehe Architektur
ADC Addiere mit Carry Rd := Rn + Op2 + Carry Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
ADD Addiere Rd := Rn + Op2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
ADR Adresse oder Registerrelativ in Register Rd := label Register laden und speichern ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
AND Logisches UND Rd := Rn AND Op2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
ASR Arithmetische Verschiebung nach rechts Rd := Rm (→) (Rs/#sh) Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
B Verzweige Pc := label Verzweigen und kontrollieren ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
BFC Bitfeld löschen Rd := Rd ([#lsb] ← #width) Datenverarbeitung ARMv6T2, ARMv7, ARMv8
BFI Bitfeld einfügen Rd := Rn ([#lsb] ← #width) Datenverarbeitung ARMv6T2, ARMv7, ARMv8
BIC Bit löschen Rd := Rn Λ Op2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
BKPT Breakpoint - - ARMv5T, ARMv6, ARMv7, ARMv8
BL Verzweige mit Link Lr := Pc + 4;

Pc := label

Verzweigen und kontrollieren ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
BLX Verzweige mit Link, Befehlssatztausch Lr := Pc + 4;

Pc := (label/Rm)

Verzweigen und kontrollieren ARMv5T, ARMv6, ARMv7, ARMv8
BX Verzweige, Befehlssatztausch Pc := Rm Verzweigen und kontrollieren ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
BXJ Verzweige, Befehlsatztausch (Jazelle) Pc := Rm Verzweigen und kontrollieren ARMv5TEJ, ARMv6, ARMv7, ARMv8
CDP Coprozessor Ausführen -> Coprozessor Coprozessor ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
CDP2 Coprozessor Ausführen -> Coprozessor Coprozessor ARMv5T, ARMv6, ARMv7, ARMv8
CLZ Zähle führende Nullen Rd := Rm(→"1") ARMv5T, ARMv6, ARMv7, ARMv8
CMN Negativ Vergleichen Set (C) -> APSR Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
CMP Vergleich Set (C) -> APSR Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
DBG Debuggen - - ARMv7, ARMv8
DMB Datenspeicherbarriere - - ARMv7, ARMv8
DSB Datensynchronisationsbarriere - - ARMv7, ARMv8
EOR Logisches exklusives ODER Rd := Rn ⊻ Op2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
ISB Befehlssynchronisationsbarriere - - ARMv7, ARMv8
LDC Kopiere Speicher zum Coprozessor CRd := label/Rn Coprozessor-Datenübertragungen (LDC, STC) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
LDC2 Kopiere Speicher zum Coprozessor CRd := label/Rn ARMv5T, ARMv6, ARMv7, ARMv8
LDM Lade mehrere Register RegList := [Rn] Blockdatenübertragung (LDM, STM) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
LDR Lade Register Rt := label Einzelne Datenübertragung (LDR, STR)

Übertragung von Halbwörtern und signierten Daten

ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
LSL Logische Verschiebung nach links Rd := Rm (←) (Rs/#sh) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
LSR Logische Verschiebung nach rechts Rd := Rm (→) (Rs/#sh) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MCR Übertrage Register zu Coprozessor CRn := Rt Coprozessor-Registerübertragungen (MRC, MCR) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MCR2 Übertrage Register zu Coprozessor CRn := Rt ARMv5T, ARMv6, ARMv7, ARMv8
MCRR Übertrage Register zu Coprozessor CRn := Rt1, Rt2 ARMv5TE, ARMv6, ARMv7, ARMv8
MCRR2 Übertrage Register zu Coprozessor CRn := Rt1, Rt2 ARMv6, ARMv7, ARMv8
MLA Multiplizieren-Akkumulieren Rd := (Rn * Rm) + Ra Multiplizieren und Akkumulieren (MUL, MLA)

Long multiplizieren und Long multiplizieren mit Akkumulieren (MULL, MLAL)

ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MLS Multiplizieren-Subtrahieren Rd := (Rn * Rm) - Ra ARMv6T2, ARMv7, ARMv8
MOV Bewegen Rd := Op2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MRC Übertrage Coprozessor zu Register Rt := CRn ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MRC2 Übertrage Coprozessor zu Register Rt := CRn ARMv5T, ARMv6, ARMv7, ARMv8
MRRC Übertrage Coprozessor zu Register Rt1, Rt2 := CRn ARMv5TE, ARMv6, ARMv7, ARMv8
MRRC2 Übertrage Coprozessor zu Register Rt1, Rt2 := CRn ARMv6, ARMv7, ARMv8
MRS Kopiere PSR in Register Rd := psr PSR-Übertragung (MRS, MSR) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MSR Kopiere Register in PSR APSR_flag := Rm PSR-Übertragung (MRS, MSR) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MUL Multiplizieren Rd := Rn * Rm Multiplizieren und Akkumulieren (MUL, MLA)

Long multiplizieren und Long multiplizieren mit Akkumulieren (MULL, MLAL)

ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
MVN Negiert Bewegen Rd := !Op2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
NOP Keine Funktion - - ARMv6K, ARMv6T2, ARMv7, ARMv8
ORR Logisches ODER Rd := Rn ٧ Op2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
PKHBT Packen von Halbwörtern Rd := Rn[15:0] Λ Rm[31:16] ARMv6, ARMv7, ARMv8
PKHTB Packen von Halbwörtern Rd := Rn[31:16] Λ Rm[15:0]
PLI Daten und Anweisungen vorladen - ARMv7, ARMv8
POP Füllt Register aus Stabel RegList := [SP+] ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
PUSH Speichert Register in den Stabel [-SP] := RegList ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
QADD Vorzeichenbehaftetes Addieren Rd := Rn + Op2 ARMv5TE, ARMv6, ARMv7, ARMv8
QADD16 Vorzeichenbehaftetes Addieren (halbword) Rd := Rn + Op2 ARMv6, ARMv7, ARMv8
QADD8 Vorzeichenbehaftetes Addieren (byte) Rd := Rn + Op2 ARMv6, ARMv7, ARMv8
QASX Vorzeichenbehaftetes Addieren, Subtrahieren (halbword) Austausch Rm[15:0]↔ ARMv6, ARMv7, ARMv8
QDADD Vorzeichenbehaftetes Double Addieren ARMv5TE, ARMv6, ARMv7, ARMv8
QDSUB Vorzeichenbehaftetes Double Subtrahieren ARMv5TE, ARMv6, ARMv7, ARMv8
QSAX Vorzeichenbehaftete Sättigung parallel subtrahieren und Halbwörter mit Austausch addieren ARMv6, ARMv7, ARMv8
QSUB Vorzeichenbehaftetes Subtrahieren ARMv5TE, ARMv6, ARMv7, ARMv8
QSUB16 Vorzeichenbehaftetes Subtrahieren (halbword) ARMv6, ARMv7, ARMv8
QSUB8 Vorzeichenbehaftetes Subtrahieren (byte) ARMv6, ARMv7, ARMv8
RBIT Umgekehrte Bytereihenfolge For (i = 0; i < 32; i++) : Rd[i] = Rm[31– i] ARMv6T2, ARMv7, ARMv8
REV Umgekehrte Bytereihenfolge in einem Wort Rd[31:24] := Rm[7:0],

Rd[23:16] := Rm[15:8],

Rd[15:8] := Rm[23:16],

Rd[7:0] := Rm[31:24]

ARMv6, ARMv7, ARMv8
REV16 Umgekehrte Bytereihenfolge in zwei Halbwörtern Rd[15:8] := Rm[7:0], Rd[7:0] := Rm[15:8], Rd[31:24] := Rm[23:16], Rd[23:16] := Rm[31:24] ARMv6, ARMv7, ARMv8
REVSH Umgekehrte Bytereihenfolge in einem Halbwort und Vorzeichenerweiterung Rd[15:8] := Rm[7:0], Rd[7:0] := Rm[15:8], Rd[31:16] := Rm[7] * &FFFF ARMv6, ARMv7, ARMv8
ROR Register rechts drehen Rd := ROR(Rm, Rs|sh) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
RRX Mit Erweitern nach rechts drehen Rd := RRX(Rm) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
RSB Umgekehrte Subtraktion Rd := Operand2 – Rn Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
RSC Umgekehrte Subtraktion mit Übertrag Rd := Operand2 – Rn – NOT(Carry) Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SADD16 Vorzeichenbehaftete parallele halbwortweise Addition ARMv6, ARMv7, ARMv8
SADD8 Vorzeichenbehaftete parallele byteweise Addition ARMv6, ARMv7, ARMv8
SASX Vorzeichenbehaftetes paralleles Addieren und Subtrahieren von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
SBC Mit Übertrag subtrahieren Rd := Rn – Operand2 – NOT(Carry) Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SBFX Vorzeichenbehafteter Bitfeld-Extrakt Rd[(width–1):0] = Rn[(width+lsb–1):lsb], Rd[31:width] = Replicate( Rn[width+lsb–1] ) ARMv6T2, ARMv7, ARMv8
SDIV Vorzeichenbehaftetes dividieren Rd := Rn / Rm ARMv7VE, OPTIONAL ARMv7-A, ARMv7-R, ARMv8
SEL Aus Bytes gemäß den APSR-GE-Flags auswählen Rd[7:0] := Rn[7:0] if GE[0] = 1, else Rd[7:0] := Rm[7:0]

Bits[15:8], [23:16], [31:24] selected similarly by GE[1], GE[2], GE[3]

ARMv6, ARMv7, ARMv8
SETEND Endianness für Speicherzugriffe einstellen ARMv6, ARMv7, ARMv8
SEV Ereignis festlegen ARMv6K, ARMv7, ARMv8
SHADD16 Vorzeichenbehaftete halbierende parallele halbwortweise Addition ARMv6, ARMv7, ARMv8
SHADD8 Vorzeichenbehaftete halbierende parallele byteweise Addition ARMv6, ARMv7, ARMv8
SHASX Vorzeichenbehaftete Halbierung paralleler Addition und Subtraktion von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
SHSAX Vorzeichenbehaftete Halbierung parallele Subtraktion und Addition von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
SHSUB16 Vorzeichenbehaftete Halbierung parallele halbwortweise Subtraktion ARMv6, ARMv7, ARMv8
SHSUB8 Vorzeichenbehaftete halbierende parallele byteweise Subtraktion ARMv6, ARMv7, ARMv8
SMLA Vorzeichenbehaftetes Multiplizieren mit Akkumulieren (32 <= 16 x 16 + 32) ARMv5TE, ARMv6, ARMv7, ARMv8
SMLAD Doppelt signiert, multiplizieren, akkumulieren

(32 <= 32 + 16 x 16 + 16 x 16)

Rd := Rn + Rm[15:0] * RsX[15:0] + Rm[31:16] * RsX[31:16] ARMv6, ARMv7, ARMv8
SMLAL Signed Multiply Accumulate (64 <= 64 + 32 x 32) RdHi,RdLo := signed(RdHi,RdLo + Rm * Rs) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SMLALD Dual Signed Multiply Accumulate Long

(64 <= 64 + 16 x 16 + 16 x 16)

RdHi,RdLo := RdHi,RdLo + Rm[15:0] * RsX[15:0] + Rm[31:16] * RsX[31:16] ARMv6, ARMv7, ARMv8
SMLAW Vorzeichenbehaftetes Multiplizieren mit Akkumulieren (32 <= 32 x 16 + 32) Rd := Rn + (Rm * Rs)[47:16] ARMv5TE, ARMv6, ARMv7, ARMv8
SMLSD Dual Signed Multiply Subtract Accumulate

(32 <= 32 + 16 x 16 - 16 x 16)

Rd := Rn + Rm[15:0] * RsX[15:0] – Rm[31:16] * RsX[31:16] ARMv6, ARMv7, ARMv8
SMLSLD Dual Signed Multiply Subtract Accumulate Long

(64 <= 64 + 16 x 16 - 16 x 16)

RdHi,RdLo := RdHi,RdLo + Rm[15:0] * RsX[15:0] – Rm[31:16] * RsX[31:16] ARMv6, ARMv7, ARMv8
SMMLA Top-Wort mit Vorzeichen Multiplizieren mit Akkumulieren (32 <= TopWord(32 x 32 + 32)) Rd := Rn + (Rm * Rs)[63:32] ARMv6, ARMv7, ARMv8
SMMLS Vorzeichenbehaftetes oberstes Wort Multiplizieren mit Subtrahieren

(32 <= TopWord(32 - 32 x 32))

Rd := Rn – (Rm * Rs)[63:32] ARMv6, ARMv7, ARMv8
SMMUL Vorzeichenbehaftetes oberes Wort Multiplizieren

(32 <= TopWord(32 x 32))

Rd := (Rm * Rs)[63:32] ARMv6, ARMv7, ARMv8
SMUAD Dual Signed Multiply und Produkte addieren Rd := Rm[15:0] * RsX[15:0] + Rm[31:16] * RsX[31:16] ARMv6, ARMv7, ARMv8
SMUL Multiplizieren mit Vorzeichen (32 <= 16 x 16) ARMv5TE, ARMv6, ARMv7, ARMv8
SMULL Multiplizieren mit Vorzeichen (64 <= 32 x 32) RdHi,RdLo := signed(Rm * Rs) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SMULW Multiplizieren mit Vorzeichen (32 <= 32 x 16) Rd := (Rm * Rs[y])[47:16] ARMv5TE, ARMv6, ARMv7, ARMv8
SMUSD Dual Signed Multiply und Produkte subtrahieren Rd := Rm[15:0] * RsX[15:0] – Rm[31:16] * RsX[31:16] ARMv6, ARMv7, ARMv8
SSAT Signiert sättigen Rd := SignedSat((Rm ASR sh), sat). <sat> range 1-32, <sh> range 1-31.

Rd := SignedSat((Rm LSL sh), sat). <sat> range 1-32, <sh> range 0-31.

ARMv6, ARMv7, ARMv8
SSAT16 Signiert sättigen, parallele Halbwörter Rd[31:16] := SignedSat(Rm[31:16], sat),

Rd[15:0] := SignedSat(Rm[15:0], sat). <sat> range 1-16.

ARMv6, ARMv7, ARMv8
SSAX Vorzeichenbehaftetes paralleles Subtrahieren und Addieren von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
SSUB16 Vorzeichenbehaftete parallele halbwortweise Subtraktion ARMv6, ARMv7, ARMv8
SSUB8 Vorzeichenbehaftete parallele byteweise Subtraktion ARMv6, ARMv7, ARMv8
STC Coprozessor speichern Coprozessor-Datenübertragungen (LDC, STC) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
STC2 Coprozessor speichern ARMv5T, ARMv6, ARMv7, ARMv8
STM Mehrere Register speichern Store list of registers to [Rn] Blockdatenübertragung (LDM, STM) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
STR Speichere Register als Word [address, size] := Rd Einzelne Datenübertragung (LDR, STR)

Übertragung von Halbwörtern und signierten Daten

ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SUB Subtrahiere Rd := Rn – imm12, imm12 range 0-4095 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SVC SuperVisor Aufruf Supervisor Call exception. 24-bit bitfield encoded in instruction. Formerly SWI. ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SWI Supervisor Call exception. 24-bit bitfield encoded in instruction. Software Interrupt (SWI) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
SXTAB Vorzeichen um ein Bytes erweitern, mit Addition Rd[31:0] := Rn[31:0] + SignExtend((Rm ROR (8 * sh))[7:0]). sh 0-3. ARMv6, ARMv7, ARMv8
SXTAB16 Vorzeichen um zwei Bytes erweitern, mit Addition Rd[31:16] := Rn[31:16] + SignExtend((Rm ROR (8 * sh))[23:16]),

Rd[15:0] := Rn[15:0] + SignExtend((Rm ROR (8 * sh))[7:0]). sh 0-3.

ARMv6, ARMv7, ARMv8
SXTAH Vorzeichen um ein Halbword erweitern, mit Addition Rd[31:0] := Rn[31:0] + SignExtend((Rm ROR (8 * sh))[15:0]). sh 0-3. ARMv6, ARMv7, ARMv8
SXTB Um ein Byte erweitern Rd[31:0] := SignExtend((Rm ROR (8 * sh))[7:0]). sh 0-3. ARMv6, ARMv7, ARMv8
SXTB16 Um zwei Bytes erweitern Rd[31:16] := SignExtend((Rm ROR (8 * sh))[23:16]),

Rd[15:0] := SignExtend((Rm ROR (8 * sh))[7:0]). sh 0-3.

ARMv6, ARMv7, ARMv8
SXTH Um ein Halbword erweitern Rd[31:0] := SignExtend((Rm ROR (8 * sh))[15:0]). sh 0-3. ARMv6, ARMv7, ARMv8
TBB Tabellenverzweigung Byte PC = PC + ZeroExtend( Memory( Rn + Rm, 1) << 1). Branch range 4-512. Rn can be PC. ARMv6T2, ARMv7, ARMv8
TBH Tabellenverzweigung Halbword PC = PC + ZeroExtend( Memory( Rn + Rm << 1, 2) << 1). Branch range 4-131072. Rn can be PC. ARMv6T2, ARMv7, ARMv8
TEQ Test auf Gleichheit Update CPSR flags on Rn EOR Operand2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
TST Testen Update CPSR flags on Rn AND Operand2 Datenverarbeitung ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
UADD16 Vorzeichenlose parallele halbwortweise Addition ARMv6, ARMv7, ARMv8
UADD8 Vorzeichenlose parallele byteweise Addition ARMv6, ARMv7, ARMv8
UASX Vorzeichenlose parallele Addition und Subtraktion von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
UBFX Vorzeichenlose Bit Field eXtract Rd[(width–1):0] = Rn[(width+lsb–1):lsb], Rd[31:width] = Replicate( 0 ) ARMv6T2, ARMv7, ARMv8
UDIV Vorzeichenlose Division Rd := Rn / Rm ARMv7VE, OPTIONAL ARMv7-A, ARMv7-R, ARMv8
UHADD16 Vorzeichenlose halbierende parallele halbwortweise Addition ARMv6, ARMv7, ARMv8
UHADD8 Vorzeichenlose halbierende parallele byteweise Addition ARMv6, ARMv7, ARMv8
UHASX Vorzeichenlose Halbierung paralleler Addition und Subtraktion von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
UHSAX Vorzeichenlose Halbierung parallele Subtraktion und Addition von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
UHSUB16 Vorzeichenlose halbierende parallele halbwortweise Subtraktion ARMv6, ARMv7, ARMv8
UHSUB8 Vorzeichenlose halbierende parallele byteweise Subtraktion ARMv6, ARMv7, ARMv8
UMAAL Vorzeichenlose Multiplikation mit Addition von Addition lang

(64 <= 32 + 32 + 32 x 32)

RdHi,RdLo := unsigned(RdHi + RdLo + Rm * Rs) ARMv6, ARMv7, ARMv8
UMLAL Vorzeichenlose Multiplikation mit Addition

(64 <= 32 x 32 + 64), (64 <= 32 x 32)

RdHi,RdLo := unsigned(RdHi,RdLo + Rm * Rs) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
UMULL Vorzeichenlose Multiplikation

(64 <= 32 x 32 + 64), (64 <= 32 x 32)

RdHi,RdLo := unsigned(Rm * Rs) ARMv4, ARMv5T, ARMv6, ARMv7, ARMv8
UQADD16 Vorzeichenlose sättigende parallele halbwortweise Addition ARMv6, ARMv7, ARMv8
UQADD8 Vorzeichenlose sättigende parallele byteweise Addition ARMv6, ARMv7, ARMv8
UQASX Vorzeichenlose sättigende parallele Addition und Subtraktion von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
UQSAX Vorzeichenlose Sättigung parallel subtrahieren und Halbwörter mit Austausch hinzufügen ARMv6, ARMv7, ARMv8
UQSUB16 Vorzeichenlose sättigende parallele halbwortweise Subtraktion ARMv6, ARMv7, ARMv8
UQSUB8 Vorzeichenlose sättigende parallele byteweise Subtraktion ARMv6, ARMv7, ARMv8
USAD8 Summe der absoluten Differenzen ohne Vorzeichen Rd := Abs(Rm[31:24] – Rs[31:24]) + Abs(Rm[23:16] – Rs[23:16])

+ Abs(Rm[15:8] – Rs[15:8]) + Abs(Rm[7:0] – Rs[7:0])

ARMv6, ARMv7, ARMv8
USADA8 Akkumulierung der Summe der absoluten Differenzen ohne Vorzeichen Rd := Rn + Abs(Rm[31:24] – Rs[31:24]) + Abs(Rm[23:16] – Rs[23:16])

+ Abs(Rm[15:8] – Rs[15:8]) + Abs(Rm[7:0] – Rs[7:0])

ARMv6, ARMv7, ARMv8
USAT Vorzeichenlos sättigen Rd := UnsignedSat((Rm ASR sh), sat). <sat> range 0-31, <sh> range 1-31.

Rd := UnsignedSat((Rm LSL sh), sat). <sat> range 0-31, <sh> range 0-31.

ARMv6, ARMv7, ARMv8
USAT16 Vorzeichenlos sättigen paralleler Halbword Rd[31:16] := UnsignedSat(Rm[31:16], sat),

Rd[15:0] := UnsignedSat(Rm[15:0], sat). <sat> range 0-15.

ARMv6, ARMv7, ARMv8
USAX Vorzeichenlose parallele Subtraktion und Addition von Halbwörtern mit Austausch ARMv6, ARMv7, ARMv8
USUB16 Vorzeichenlose parallele wordweise Subtraktion ARMv6, ARMv7, ARMv8
USUB8 Vorzeichenlose parallele byteweise Subtraktion ARMv6, ARMv7, ARMv8
UXTAB Null erweitert Byte mit Addition Rd[31:0] := Rn[31:0] + ZeroExtend((Rm ROR (8 * sh))[7:0]). sh 0-3. ARMv6, ARMv7, ARMv8
UXTAB16 Null erweitert zwei Bytes mit Addition Rd[31:16] := Rn[31:16] + ZeroExtend((Rm ROR (8 * sh))[23:16]),

Rd[15:0] := Rn[15:0] + ZeroExtend((Rm ROR (8 * sh))[7:0]). sh 0-3.

ARMv6, ARMv7, ARMv8
UXTAH Null erweitern Halbwort mit Addition Rd[31:0] := Rn[31:0] + ZeroExtend((Rm ROR (8 * sh))[15:0]). sh 0-3. ARMv6, ARMv7, ARMv8
UXTB Null erweitert Byte Rd[31:0] := ZeroExtend((Rm ROR (8 * sh))[7:0]). sh 0-3. ARMv6, ARMv7, ARMv8
UXTB16 Null erweitert zwei Bytes Rd[31:16] := ZeroExtend((Rm ROR (8 * sh))[23:16]),

Rd[15:0] := ZeroExtend((Rm ROR (8 * sh))[7:0]). sh 0-3.

ARMv6, ARMv7, ARMv8
UXTH Null erweitert Halbwort Rd[31:0] := ZeroExtend((Rm ROR (8 * sh))[15:0]). sh 0-3. ARMv6, ARMv7, ARMv8
VABA NEON- und VFP-Anweisungen Erweitertes SIMD
VABD NEON- und VFP-Anweisungen Erweitertes SIMD
VABS NEON- und VFP-Anweisungen VFPv2, VFPv3, VFPv4
VAC NEON- und VFP-Anweisungen Erweitertes SIMD
VADD NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VADDHN NEON- und VFP-Anweisungen Erweitertes SIMD
VADDL NEON- und VFP-Anweisungen Erweitertes SIMD
VADDW NEON- und VFP-Anweisungen Erweitertes SIMD
VAND NEON- und VFP-Anweisungen Erweitertes SIMD
VBIC NEON- und VFP-Anweisungen Erweitertes SIMD
VBIF NEON- und VFP-Anweisungen Erweitertes SIMD
VBIT NEON- und VFP-Anweisungen Erweitertes SIMD
VBSL NEON- und VFP-Anweisungen Erweitertes SIMD
VCEQ NEON- und VFP-Anweisungen Erweitertes SIMD
VCGE NEON- und VFP-Anweisungen Erweitertes SIMD
VCGT NEON- und VFP-Anweisungen Erweitertes SIMD
VCLE NEON- und VFP-Anweisungen Erweitertes SIMD
VCLS NEON- und VFP-Anweisungen Erweitertes SIMD
VCLT NEON- und VFP-Anweisungen Erweitertes SIMD
VCLZ NEON- und VFP-Anweisungen Erweitertes SIMD
VCMP NEON- und VFP-Anweisungen VFPv2, VFPv3, VFPv4
VCNT NEON- und VFP-Anweisungen Erweitertes SIMD
VCVT NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VDIV NEON- und VFP-Anweisungen VFPv2, VFPv3, VFPv4
VDUP NEON- und VFP-Anweisungen Erweitertes SIMD
VEOR NEON- und VFP-Anweisungen Erweitertes SIMD
VEXT NEON- und VFP-Anweisungen Erweitertes SIMD
VFM NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv4
VFNM NEON- und VFP-Anweisungen VFPv4
VHADD NEON- und VFP-Anweisungen Erweitertes SIMD
VHSUB NEON- und VFP-Anweisungen Erweitertes SIMD
VLD1 NEON- und VFP-Anweisungen Erweitertes SIMD
VLD2 NEON- und VFP-Anweisungen Erweitertes SIMD
VLD3 NEON- und VFP-Anweisungen Erweitertes SIMD
VLD4 NEON- und VFP-Anweisungen Erweitertes SIMD
VLDM NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VLDR NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VMAX NEON- und VFP-Anweisungen Erweitertes SIMD
VMIN NEON- und VFP-Anweisungen Erweitertes SIMD
VMLA NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VMLAL NEON- und VFP-Anweisungen Erweitertes SIMD
VMLS NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VMLSL NEON- und VFP-Anweisungen Erweitertes SIMD
VMOV NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VMOVL NEON- und VFP-Anweisungen Erweitertes SIMD
VMOVN NEON- und VFP-Anweisungen Erweitertes SIMD
VMRS NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VMSR NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VMUL NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VMULL NEON- und VFP-Anweisungen Erweitertes SIMD
VMVN NEON- und VFP-Anweisungen Erweitertes SIMD
VNEG NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VNMLA NEON- und VFP-Anweisungen VFPv2, VFPv3, VFPv4
VNMLS NEON- und VFP-Anweisungen VFPv2, VFPv3, VFPv4
VNMUL NEON- und VFP-Anweisungen VFPv2, VFPv3, VFPv4
VORN NEON- und VFP-Anweisungen Erweitertes SIMD
VORR NEON- und VFP-Anweisungen Erweitertes SIMD
VPADAL NEON- und VFP-Anweisungen Erweitertes SIMD
VPADD NEON- und VFP-Anweisungen Erweitertes SIMD
VPADDL NEON- und VFP-Anweisungen Erweitertes SIMD
VPMAX NEON- und VFP-Anweisungen Erweitertes SIMD
VPMIN NEON- und VFP-Anweisungen Erweitertes SIMD
VPOP NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VPUSH NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VQABS NEON- und VFP-Anweisungen Erweitertes SIMD
VQADD NEON- und VFP-Anweisungen Erweitertes SIMD
VQDMLAL NEON- und VFP-Anweisungen Erweitertes SIMD
VQDMLSL NEON- und VFP-Anweisungen Erweitertes SIMD
VQDMULH NEON- und VFP-Anweisungen Erweitertes SIMD
VQDMULL NEON- und VFP-Anweisungen Erweitertes SIMD
VQMOVN NEON- und VFP-Anweisungen Erweitertes SIMD
VQMOVUN NEON- und VFP-Anweisungen Erweitertes SIMD
VQNEG NEON- und VFP-Anweisungen Erweitertes SIMD
VQRDMULH NEON- und VFP-Anweisungen Erweitertes SIMD
VQRSHL NEON- und VFP-Anweisungen Erweitertes SIMD
VQRSHRN NEON- und VFP-Anweisungen Erweitertes SIMD
VQRSHRUN NEON- und VFP-Anweisungen Erweitertes SIMD
VQSHL NEON- und VFP-Anweisungen Erweitertes SIMD
VQSHLU NEON- und VFP-Anweisungen Erweitertes SIMD
VQSHRN NEON- und VFP-Anweisungen Erweitertes SIMD
VQSHRUN NEON- und VFP-Anweisungen Erweitertes SIMD
VQSUB NEON- und VFP-Anweisungen Erweitertes SIMD
VRADDHN NEON- und VFP-Anweisungen Erweitertes SIMD
VRECPE NEON- und VFP-Anweisungen Erweitertes SIMD
VRECPS NEON- und VFP-Anweisungen Erweitertes SIMD
VREV16 NEON- und VFP-Anweisungen Erweitertes SIMD
VREV32 NEON- und VFP-Anweisungen Erweitertes SIMD
VREV64 NEON- und VFP-Anweisungen Erweitertes SIMD
VRHADD NEON- und VFP-Anweisungen Erweitertes SIMD
VRSHL NEON- und VFP-Anweisungen Erweitertes SIMD
VRSHR NEON- und VFP-Anweisungen Erweitertes SIMD
VRSHRN NEON- und VFP-Anweisungen Erweitertes SIMD
VRSQRTE NEON- und VFP-Anweisungen Erweitertes SIMD
VRSQRTS NEON- und VFP-Anweisungen Erweitertes SIMD
VRSRA NEON- und VFP-Anweisungen Erweitertes SIMD
VRSUBHN NEON- und VFP-Anweisungen Erweitertes SIMD
VSHL NEON- und VFP-Anweisungen Erweitertes SIMD
VSHLL NEON- und VFP-Anweisungen Erweitertes SIMD
VSHR NEON- und VFP-Anweisungen Erweitertes SIMD
VSHRN NEON- und VFP-Anweisungen Erweitertes SIMD
VSLI NEON- und VFP-Anweisungen Erweitertes SIMD
VSQRT NEON- und VFP-Anweisungen VFPv2, VFPv3, VFPv4
VSRA NEON- und VFP-Anweisungen Erweitertes SIMD
VSRI NEON- und VFP-Anweisungen Erweitertes SIMD
VST1 NEON- und VFP-Anweisungen Erweitertes SIMD
VST2 NEON- und VFP-Anweisungen Erweitertes SIMD
VST3 NEON- und VFP-Anweisungen Erweitertes SIMD
VST4 NEON- und VFP-Anweisungen Erweitertes SIMD
VSTM NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VSTR NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VSUB NEON- und VFP-Anweisungen Erweitertes SIMD, VFPv2, VFPv3, VFPv4
VSUBHN NEON- und VFP-Anweisungen Erweitertes SIMD
VSUBL NEON- und VFP-Anweisungen Erweitertes SIMD
VSUBW NEON- und VFP-Anweisungen Erweitertes SIMD
VSWP NEON- und VFP-Anweisungen Erweitertes SIMD
VTBL NEON- und VFP-Anweisungen Erweitertes SIMD
VTBX NEON- und VFP-Anweisungen Erweitertes SIMD
VTRN NEON- und VFP-Anweisungen Erweitertes SIMD
VTST NEON- und VFP-Anweisungen Erweitertes SIMD
VUZP NEON- und VFP-Anweisungen Erweitertes SIMD
VZIP NEON- und VFP-Anweisungen Erweitertes SIMD
WFE Auf Ereignis warten Wait for event, IRQ, FIQ, Imprecise abort, or Debug entry request. NOP if not implemented ARMv6K, ARMv7, ARMv8
WFI Warte auf Unterbrechung Wait for IRQ, FIQ, Imprecise abort, or Debug entry request. NOP if not implemented. ARMv6K, ARMv7, ARMv8
YIELD Yield Yield control to alternative thread. NOP if not implemented. ARMv6K, ARMv7, ARMv8