Überblick ARM 32-Bit Befehlssatz
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:
- Übergeordnete Übersicht über den Prozessor: https://developer.arm.com/documentation/den0024/a/
- ARM Referenzhandbuch: https://developer.arm.com/documentation/ddi0487/ja/
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
| 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) |
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) |
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 |