ARM32-Befehle (Thumb-2)

Befehlsreferenz: i386 · x64 · ARM32 (Thumb-2) · ARM64 (AArch64)

154 Befehle in 231 Formen für .arch thumb: Name, Operanden, die Bitkodierung (16 oder 32 Bit) und eine kurze Beschreibung mit der Wirkung als Pseudocode. Enthalten sind die 16-Bit-Befehle und die 32-Bit-Befehle: Rechnen, Logik, Schieben, Bitfelder, Multiplikation und Division, Laden und Speichern (auch unprivilegiert und exklusiv), Sprünge, Systembefehle, Koprozessor-Zugriffe und Gleitkomma (VFP). Alle Befehle, die Dismonite zerlegt, sind enthalten. Noch nicht dabei sind NEON, die DSP- und Sättigungs-Befehle und weitere Varianten. Der klassische ARM-Modus (A32) fehlt, weil Windows on ARM nur Thumb-2 benutzt.

So liest du die Tabelle

Ein Thumb-Befehl ist 16 oder 32 Bit lang; ein 32-Bit-Befehl besteht aus zwei Halbwörtern, die im Speicher nacheinander stehen (zuerst das obere Halbwort, hier links, dann das untere, hier rechts, mit einer Lücke dazwischen). Die Kodierung zeigt die Bits von links (höchste Bit-Nummer) nach rechts: feste Bits als Ziffern (der Opcode), die Namen sind Felder. Mit der Maus auf einem Feld steht der Bereich der Bits. Rd, Rn, Rm, Rt sind Register: in 16-Bit-Befehlen meist 3 Bit (r0 bis r7), in 32-Bit-Befehlen 4 Bit (r0 bis r15). imm… ist eine Konstante, cond eine Bedingung (4 Bit), S wählt die Form, die die Flags setzt. Darunter steht der Wert der festen Bits und die Maske in Hex: Ein Befehl gehört zu dieser Form, wenn (Wort & Maske) == Wert ist.

Flags: Die 16-Bit-Befehle zum Rechnen setzen die Flags (N Z C V), wenn sie nicht in einem IT-Block stehen, und sonst nicht; deshalb heißen sie adds, movs, lsls ... Die 32-Bit-Formen setzen die Flags nur, wenn das Bit S gesetzt ist. Wirkung: Rd = Rn + Rm und ähnlich ist Pseudocode; sext und zext erweitern mit Vorzeichen und mit Nullen, >>s schiebt mit Vorzeichen, [x] ist der Speicher an der Adresse x.

Jede Kodierung in dieser Tabelle ist gegen den Zerleger von Dismonite geprüft: Mit zufälligen Werten für die Felder ergibt sie wieder diesen Befehl (oder seinen Alias).

Der Pseudocode ist wie Quelltext englisch geschrieben (if, then, for every element), auch auf der deutschen Seite.

BefehlOperandenKodierungBeschreibung
adcRd, Rn, #const11110 i 0 1010 S Rn 0 imm3 Rd imm80xF1400000 / Maske 0xFBE08000Addition mit Übertrag: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn + const + C; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetik
Rd, Rn, Rm{, shift #imm}1110101 1010 S Rn 0 imm3 Rd imm2 type Rm0xEB400000 / Maske 0xFFE08000Addition mit Übertrag: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn + shift(Rm) + CFlags: N Z C V (if S)Arithmetik
adcsRdn, Rmauch: adc010000 0101 Rm Rdn0x4140 / Maske 0xFFC0Addition mit Übertrag (C)Rdn = Rdn + Rm + CFlags: N Z C VArithmetik
addRdn, Rm010001 00 DN Rm Rdn0x4400 / Maske 0xFF00Addition zweier Register (auch r8 bis r15, setzt keine Flags)Rdn = Rdn + RmArithmetik
Rd, sp, #imm8*41010 1 Rd imm80xA800 / Maske 0xF800Addition des Stackzeigers und einer KonstantenRd = sp + imm8 * 4Arithmetik
sp, sp, #imm7*41011 0000 0 imm70xB000 / Maske 0xFF80Erhöhung des Stackzeigerssp = sp + imm7 * 4Arithmetik
Rd, Rn, #constauch: cmn11110 i 0 1000 S Rn 0 imm3 Rd imm80xF1000000 / Maske 0xFBE08000Addition: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn + const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetik
Rd, Rn, Rm{, shift #imm}auch: cmn1110101 1000 S Rn 0 imm3 Rd imm2 type Rm0xEB000000 / Maske 0xFFE08000Addition: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn + shift(Rm)Flags: N Z C V (if S)Arithmetik
addsRd, Rn, Rmauch: add000 11 0 0 Rm Rn Rd0x1800 / Maske 0xFE00Addition zweier RegisterRd = Rn + RmFlags: N Z C VArithmetik
Rd, Rn, #imm3auch: add000 11 1 0 imm3 Rn Rd0x1C00 / Maske 0xFE00Addition einer Konstanten (3 Bit)Rd = Rn + imm3Flags: N Z C VArithmetik
Rdn, #imm8auch: add001 10 Rdn imm80x3000 / Maske 0xF800Addition einer Konstanten (8 Bit)Rdn = Rdn + imm8Flags: N Z C VArithmetik
addwRd, Rn, #imm12auch: add11110 i 100000 Rn 0 imm3 Rd imm80xF2000000 / Maske 0xFBF08000Addition einer Konstanten (12 Bit)Rd = Rn + imm12 (i:imm3:imm8)Arithmetik
adrRd, labelauch: add1010 0 Rd imm80xA000 / Maske 0xF800Adresse relativ zum BefehlszeigerRd = align(pc, 4) + imm8 * 4Konstanten und Adressen laden
andRd, Rn, #constauch: tst11110 i 0 0000 S Rn 0 imm3 Rd imm80xF0000000 / Maske 0xFBE08000Bitweises UND: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn & const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logik und Bits
Rd, Rn, Rm{, shift #imm}auch: tst1110101 0000 S Rn 0 imm3 Rd imm2 type Rm0xEA000000 / Maske 0xFFE08000Bitweises UND: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn & shift(Rm)Flags: N Z C V (if S)Logik und Bits
andsRdn, Rmauch: and010000 0000 Rm Rdn0x4000 / Maske 0xFFC0Bitweises UNDRdn = Rdn & RmFlags: N ZLogik und Bits
asrRd, Rn, Rm11111010 0 10 S Rn 1111 Rd 0000 Rm0xFA40F000 / Maske 0xFFE0F0F0Schieben rechts mit Vorzeichen um ein Register (32-Bit-Form)Rd = Rn >>s Rm[7:0]Flags: N Z C (if S)Schieben und Rotieren
asrsRd, Rm, #imm5auch: asr000 10 imm5 Rm Rd0x1000 / Maske 0xF800Schieben nach rechts mit Vorzeichen um eine KonstanteRd = Rm >>s imm5 (imm5 = 0 means 32)Flags: N Z CSchieben und Rotieren
Rdn, Rmauch: asr010000 0100 Rm Rdn0x4100 / Maske 0xFFC0Schieben nach rechts mit Vorzeichen um ein RegisterRdn = Rdn >>s Rm[7:0]Flags: N Z CSchieben und Rotieren
blabel11100 imm110xE000 / Maske 0xF800Sprung (relativ, +-2 KB)pc = pc + (sext(imm11) << 1)Sprünge und Aufrufe
label11110 S imm10 10 J1 1 J2 imm110xF0009000 / Maske 0xF800D000Sprung (relativ, +-16 MB)pc = pc + sext(S:J1:J2:imm10:imm11 << 1)Sprünge und Aufrufe
b.condlabel1101 cond imm80xD000 / Maske 0xF000Bedingter Sprung (relativ, +-256 Byte)if cond then pc = pc + (sext(imm8) << 1)Sprünge und Aufrufe
label11110 S cond imm6 10 J1 0 J2 imm110xF0008000 / Maske 0xF800D000Bedingter Sprung (relativ, +-1 MB)if cond then pc = pc + sext(S:J2:J1:imm6:imm11 << 1)Sprünge und Aufrufe
bfiRd, Rn, #lsb, #widthauch: bfc11110 0 110110 Rn 0 imm3 Rd imm2 0 msb0xF3600000 / Maske 0xFFF08020Einfügen eines Bitfeldes aus Rn in Rd (bfc: Nullen)Rd[msb : lsb] = Rn[msb - lsb : 0]Bitfelder
bicRd, Rn, #const11110 i 0 0001 S Rn 0 imm3 Rd imm80xF0200000 / Maske 0xFBE08000Bitweises UND mit invertierter Konstante: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn & ~const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logik und Bits
Rd, Rn, Rm{, shift #imm}1110101 0001 S Rn 0 imm3 Rd imm2 type Rm0xEA200000 / Maske 0xFFE08000Bitweises UND mit invertiertem Operanden: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn & ~shift(Rm)Flags: N Z C V (if S)Logik und Bits
bicsRdn, Rmauch: bic010000 1110 Rm Rdn0x4380 / Maske 0xFFC0Bitweises UND mit invertiertem Operanden (Bit löschen)Rdn = Rdn & ~RmFlags: N ZLogik und Bits
bkpt#imm81011 1110 imm80xBE00 / Maske 0xFF00Haltepunktraise a breakpoint exceptionSystem und Privilegien
bllabel11110 S imm10 11 J1 1 J2 imm110xF000D000 / Maske 0xF800D000Aufruf einer Funktion (relativ, +-16 MB, lr = Rücksprung)lr = (pc + 4) | 1; pc = pc + sext(S:J1:J2:imm10:imm11 << 1)Sprünge und Aufrufe
blxRm010001 11 1 Rm 0000x4780 / Maske 0xFF87Aufruf der Funktion an der Adresse im Register (lr = Rücksprung)lr = (pc + 2) | 1; pc = Rm & ~1Sprünge und Aufrufe
label11110 S imm10 11 J1 0 J2 imm10 00xF000C000 / Maske 0xF800D001Aufruf einer ARM-Funktion (relativ, wechselt in den ARM-Befehlssatz)lr = (pc + 4) | 1; pc = align(pc, 4) + sext(S:J1:J2:imm10H:imm10L << 2); instruction set = ARMSprünge und Aufrufe
blxnsRm010001111 Rm 1000x4784 / Maske 0xFF87Aufruf eines Registers mit Wechsel in den nicht sicheren Zustand (TrustZone, ARMv8-M)lr = next; pc = Rm; state = non-secureSprünge und Aufrufe
bxRm010001 11 0 Rm 0000x4700 / Maske 0xFF87Sprung zur Adresse im Register (Bit 0 wählt Thumb, bei Bit 0 = 0 ARM)pc = Rm & ~1; instruction set = Rm[0]Sprünge und Aufrufe
bxnsRm010001110 Rm 1000x4704 / Maske 0xFF87Sprung zu einem Register mit Wechsel in den nicht sicheren Zustand (TrustZone, ARMv8-M)pc = Rm; state = non-secureSprünge und Aufrufe
cbnzRn, label1011 10 i 1 imm5 Rn0xB900 / Maske 0xFD00Sprung vorwärts, wenn das Register nicht 0 istif Rn != 0 then pc = pc + (i:imm5 << 1)Sprünge und Aufrufe
cbzRn, label1011 00 i 1 imm5 Rn0xB100 / Maske 0xFD00Sprung vorwärts, wenn das Register 0 istif Rn == 0 then pc = pc + (i:imm5 << 1)Sprünge und Aufrufe
clzRd, Rm111110101011 Rm 1111 Rd 1000 Rm0xFAB0F080 / Maske 0xFFF0F0F0Zählen der führenden NullbitsRd = count_leading_zeros(Rm)Logik und Bits
cmnRn, Rm010000 1011 Rm Rn0x42C0 / Maske 0xFFC0Vergleich durch Addition (Rn plus Rm), nur die Flags ändern sichflags = Rn + RmFlags: N Z C VVergleichen und Tauschen
cmpRn, #imm8001 01 Rn imm80x2800 / Maske 0xF800Vergleich mit einer Konstanten (8 Bit)flags = Rn - imm8Flags: N Z C VVergleichen und Tauschen
Rn, Rm010000 1010 Rm Rn0x4280 / Maske 0xFFC0Vergleich (Rn minus Rm), nur die Flags ändern sichflags = Rn - RmFlags: N Z C VVergleichen und Tauschen
Rn, Rm010001 01 N Rm Rn0x4500 / Maske 0xFF00Vergleich zweier Register (auch r8 bis r15)flags = Rn - RmFlags: N Z C VVergleichen und Tauschen
cpsidiauch: cpsie1011 0110 011 im 0 0 1 00xB662 / Maske 0xFFEFSperren (cpsid) oder Erlauben (cpsie) der Interrupts (privilegiert)PRIMASK = imSystem und Privilegien
dmboption111100111011 1111 1000 1111 0101 option0xF3BF8F50 / Maske 0xFFFFFFF0Speicherschranke für die Reihenfolge der Zugriffeearlier memory accesses are observed before later onesSystem und Privilegien
dsboption111100111011 1111 1000 1111 0100 option0xF3BF8F40 / Maske 0xFFFFFFF0Speicherschranke: wartet, bis alle Zugriffe fertig sindwait until all earlier memory accesses are completeSystem und Privilegien
eorRd, Rn, #constauch: teq11110 i 0 0100 S Rn 0 imm3 Rd imm80xF0800000 / Maske 0xFBE08000Bitweises exklusives ODER: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn ^ const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logik und Bits
Rd, Rn, Rm{, shift #imm}auch: teq1110101 0100 S Rn 0 imm3 Rd imm2 type Rm0xEA800000 / Maske 0xFFE08000Bitweises exklusives ODER: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn ^ shift(Rm)Flags: N Z C V (if S)Logik und Bits
eorsRdn, Rmauch: eor010000 0001 Rm Rdn0x4040 / Maske 0xFFC0Bitweises exklusives ODERRdn = Rdn ^ RmFlags: N ZLogik und Bits
hint#imm10111111 hint 00000xBF00 / Maske 0xFF0FHinweis-Befehl mit einer Nummer von 0 bis 15 (nop, yield, wfe, wfi, sev haben eigene Namen; die übrigen tun nichts)no changeSystem und Privilegien
isboption111100111011 1111 1000 1111 0110 option0xF3BF8F60 / Maske 0xFFFFFFF0Befehlsschranke: leert die Pipelineall instructions after it are fetched anewSystem und Privilegien
it{x{y{z}}} condauch: ite, itt, itee, itet, itte, ittt, iteee, iteet, itete, itett, ittee, ittet, ittte, itttt1011 1111 firstcond mask0xBF00 / Maske 0xFF00IT-Block: macht die folgenden 1 bis 4 Befehle bedingtthe next instructions run only if the condition holds (or its opposite for else)System und Privilegien
ldmRn{!}, {registers}auch: ldmia11001 Rn register_list0xC800 / Maske 0xF800Laden mehrerer Register (aufwärts)for each register in the list: reg = [Rn]; Rn = Rn + 4Laden und Speichern
Rn{!}, {registers}auch: ldmia, pop1110100010 W 1 Rn register_list0xE8900000 / Maske 0xFFD00000Laden mehrerer Register (aufwärts)for each register in the list: reg = [Rn]; Rn = Rn + 4Laden und Speichern
ldmdbRn{!}, {registers}1110100100 W 1 Rn register_list0xE9100000 / Maske 0xFFD00000Laden mehrerer Register (abwärts)for each register in the list, last first: Rn = Rn - 4; reg = [Rn]Laden und Speichern
ldrRt, label01001 Rt imm80x4800 / Maske 0xF800Laden eines Wortes relativ zum Befehlszeiger (Konstantenpool, bis 1020 Byte)Rt = [align(pc, 4) + imm8 * 4]Laden und Speichern
Rt, [Rn, Rm]0101 100 Rm Rn Rt0x5800 / Maske 0xFE00Laden eines Wortes (Register-Adresse)Rt = [Rn + Rm]Laden und Speichern
Rt, [Rn{, #imm5*4}]011 01 imm5 Rn Rt0x6800 / Maske 0xF800Laden eines Wortes (Konstante als Abstand)Rt = [Rn + imm5 * 4]Laden und Speichern
Rt, [sp{, #imm8*4}]100 11 Rt imm80x9800 / Maske 0xF800Laden eines Wortes relativ zum StackzeigerRt = [sp + imm8 * 4]Laden und Speichern
Rt, [Rn, #imm12]111110001101 Rn Rt imm120xF8D00000 / Maske 0xFFF00000Laden eines Wortes (Konstante, 12 Bit, nur vorwärts)Rt = [Rn + imm12]Laden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000101 Rn Rt 1 P U W imm80xF8500800 / Maske 0xFFF00800Laden eines Wortes (Konstante, 8 Bit, mit oder ohne Rückschreiben)Rt = [Rn +/- imm8]Laden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110000101 Rn Rt 000000 imm2 Rm0xF8500000 / Maske 0xFFF00FC0Laden eines Wortes (Register, optional um 0 bis 3 nach links verschoben)Rt = [Rn + (Rm << imm2)]Laden und Speichern
Rt, label11111000 U 1011111 Rt imm120xF85F0000 / Maske 0xFF7F0000Laden eines Wortes relativ zum Befehlszeiger (+-4 KB)Rt = [align(pc, 4) +/- imm12]Laden und Speichern
ldrbRt, [Rn, Rm]0101 110 Rm Rn Rt0x5C00 / Maske 0xFE00Laden eines Bytes (Register-Adresse)Rt = zext([Rn + Rm])Laden und Speichern
Rt, [Rn{, #imm5}]011 11 imm5 Rn Rt0x7800 / Maske 0xF800Laden eines Bytes (Konstante als Abstand)Rt = zext([Rn + imm5])Laden und Speichern
Rt, [Rn, #imm12]111110001001 Rn Rt imm120xF8900000 / Maske 0xFFF00000Laden eines Bytes (Konstante, 12 Bit, nur vorwärts)Rt = zext([Rn + imm12])Laden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000001 Rn Rt 1 P U W imm80xF8100800 / Maske 0xFFF00800Laden eines Bytes (Konstante, 8 Bit, mit oder ohne Rückschreiben)Rt = zext([Rn +/- imm8])Laden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110000001 Rn Rt 000000 imm2 Rm0xF8100000 / Maske 0xFFF00FC0Laden eines Bytes (Register, optional um 0 bis 3 nach links verschoben)Rt = zext([Rn + (Rm << imm2)])Laden und Speichern
ldrbtRt, [Rn{, #imm8}]111110000001 Rn Rt 1110 imm80xF8100E00 / Maske 0xFFF00F00Laden eines Bytes mit den Rechten des Anwendungs-ModusRt = zext([Rn + imm8])Laden und Speichern
ldrdRt, Rt2, [Rn, #+/-imm8*4]{!} / [Rn], #+/-imm8*41110100 P U 1 W 1 Rn Rt Rt2 imm80xE8500000 / Maske 0xFE500000Laden eines Registerpaares (zwei Wörter)Rt = [addr]; Rt2 = [addr + 4]Laden und Speichern
ldrexRt, [Rn{, #imm8*4}]111010000101 Rn Rt 1111 imm80xE8500F00 / Maske 0xFFF00F00Laden (exklusiv): setzt den Exklusiv-MonitorRt = [Rn + imm8 * 4]; set the exclusive monitorLaden und Speichern
ldrexbRt, [Rn]111010001101 Rn Rt 1111 0100 11110xE8D00F4F / Maske 0xFFF00FFFLaden eines Bytes (exklusiv)Rt = zext([Rn]); set the exclusive monitorLaden und Speichern
ldrexdRt, Rt2, [Rn]111010001101 Rn Rt Rt2 0111 11110xE8D0007F / Maske 0xFFF000FFLaden eines Doppelwortes (exklusiv): setzt den Exklusiv-MonitorRt:Rt2 = [Rn]; mark exclusiveLaden und Speichern
ldrexhRt, [Rn]111010001101 Rn Rt 1111 0101 11110xE8D00F5F / Maske 0xFFF00FFFLaden eines Halbwortes (exklusiv)Rt = zext([Rn]); set the exclusive monitorLaden und Speichern
ldrhRt, [Rn, Rm]0101 101 Rm Rn Rt0x5A00 / Maske 0xFE00Laden eines Halbwortes (Register-Adresse)Rt = zext([Rn + Rm])Laden und Speichern
Rt, [Rn{, #imm5*2}]100 01 imm5 Rn Rt0x8800 / Maske 0xF800Laden eines Halbwortes (Konstante als Abstand)Rt = zext([Rn + imm5 * 2])Laden und Speichern
Rt, [Rn, #imm12]111110001011 Rn Rt imm120xF8B00000 / Maske 0xFFF00000Laden eines Halbwortes (Konstante, 12 Bit, nur vorwärts)Rt = zext([Rn + imm12])Laden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000011 Rn Rt 1 P U W imm80xF8300800 / Maske 0xFFF00800Laden eines Halbwortes (Konstante, 8 Bit, mit oder ohne Rückschreiben)Rt = zext([Rn +/- imm8])Laden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110000011 Rn Rt 000000 imm2 Rm0xF8300000 / Maske 0xFFF00FC0Laden eines Halbwortes (Register, optional um 0 bis 3 nach links verschoben)Rt = zext([Rn + (Rm << imm2)])Laden und Speichern
ldrhtRt, [Rn{, #imm8}]111110000011 Rn Rt 1110 imm80xF8300E00 / Maske 0xFFF00F00Laden eines Halbwortes mit den Rechten des Anwendungs-ModusRt = zext([Rn + imm8])Laden und Speichern
ldrsbRt, [Rn, Rm]0101 011 Rm Rn Rt0x5600 / Maske 0xFE00Laden eines Bytes mit Vorzeichen (Register-Adresse)Rt = sext([Rn + Rm])Laden und Speichern
Rt, [Rn, #imm12]111110011001 Rn Rt imm120xF9900000 / Maske 0xFFF00000Laden eines Bytes mit Vorzeichen (Konstante, 12 Bit, nur vorwärts)Rt = sext([Rn + imm12])Laden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110010001 Rn Rt 1 P U W imm80xF9100800 / Maske 0xFFF00800Laden eines Bytes mit Vorzeichen (Konstante, 8 Bit, mit oder ohne Rückschreiben)Rt = sext([Rn +/- imm8])Laden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110010001 Rn Rt 000000 imm2 Rm0xF9100000 / Maske 0xFFF00FC0Laden eines Bytes mit Vorzeichen (Register, optional um 0 bis 3 nach links verschoben)Rt = sext([Rn + (Rm << imm2)])Laden und Speichern
ldrsbtRt, [Rn{, #imm8}]111110010001 Rn Rt 1110 imm80xF9100E00 / Maske 0xFFF00F00Laden eines Bytes mit Vorzeichenerweiterung mit den Rechten des Anwendungs-ModusRt = sext([Rn + imm8])Laden und Speichern
ldrshRt, [Rn, Rm]0101 111 Rm Rn Rt0x5E00 / Maske 0xFE00Laden eines Halbwortes mit Vorzeichen (Register-Adresse)Rt = sext([Rn + Rm])Laden und Speichern
Rt, [Rn, #imm12]111110011011 Rn Rt imm120xF9B00000 / Maske 0xFFF00000Laden eines Halbwortes mit Vorzeichen (Konstante, 12 Bit, nur vorwärts)Rt = sext([Rn + imm12])Laden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110010011 Rn Rt 1 P U W imm80xF9300800 / Maske 0xFFF00800Laden eines Halbwortes mit Vorzeichen (Konstante, 8 Bit, mit oder ohne Rückschreiben)Rt = sext([Rn +/- imm8])Laden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110010011 Rn Rt 000000 imm2 Rm0xF9300000 / Maske 0xFFF00FC0Laden eines Halbwortes mit Vorzeichen (Register, optional um 0 bis 3 nach links verschoben)Rt = sext([Rn + (Rm << imm2)])Laden und Speichern
ldrshtRt, [Rn{, #imm8}]111110010011 Rn Rt 1110 imm80xF9300E00 / Maske 0xFFF00F00Laden eines Halbwortes mit Vorzeichenerweiterung mit den Rechten des Anwendungs-ModusRt = sext([Rn + imm8])Laden und Speichern
ldrtRt, [Rn{, #imm8}]111110000101 Rn Rt 1110 imm80xF8500E00 / Maske 0xFFF00F00Laden eines Wortes mit den Rechten des Anwendungs-ModusRt = [Rn + imm8]Laden und Speichern
lslRd, Rn, Rm11111010 0 00 S Rn 1111 Rd 0000 Rm0xFA00F000 / Maske 0xFFE0F0F0Schieben links um ein Register (32-Bit-Form)Rd = Rn << Rm[7:0]Flags: N Z C (if S)Schieben und Rotieren
lslsRd, Rm, #imm5auch: lsl, movs000 00 imm5 Rm Rd0x0000 / Maske 0xF800Schieben nach links um eine KonstanteRd = Rm << imm5Flags: N Z CSchieben und Rotieren
Rdn, Rmauch: lsl010000 0010 Rm Rdn0x4080 / Maske 0xFFC0Schieben nach links um ein RegisterRdn = Rdn << Rm[7:0]Flags: N Z CSchieben und Rotieren
lsrRd, Rn, Rm11111010 0 01 S Rn 1111 Rd 0000 Rm0xFA20F000 / Maske 0xFFE0F0F0Schieben rechts ohne Vorzeichen um ein Register (32-Bit-Form)Rd = Rn >> Rm[7:0]Flags: N Z C (if S)Schieben und Rotieren
lsrsRd, Rm, #imm5auch: lsr000 01 imm5 Rm Rd0x0800 / Maske 0xF800Schieben nach rechts ohne Vorzeichen um eine KonstanteRd = Rm >> imm5 (imm5 = 0 means 32)Flags: N Z CSchieben und Rotieren
Rdn, Rmauch: lsr010000 0011 Rm Rdn0x40C0 / Maske 0xFFC0Schieben nach rechts ohne Vorzeichen um ein RegisterRdn = Rdn >> Rm[7:0]Flags: N Z CSchieben und Rotieren
mcrcoproc, #opc1, Rt, CRn, CRm{, #opc2}auch: mrc1110 1110 opc1 L CRn Rt coproc opc2 1 CRm0xEE000010 / Maske 0xFF000010Koprozessor-Zugriff: Schreiben eines Registers in einen Koprozessor (mcr) oder Lesen (mrc, L = 1)coprocessor register = Rt or Rt = coprocessor registerSystem und Privilegien
mlaRd, Rn, Rm, Ra111110110000 Rn Ra Rd 0000 Rm0xFB000000 / Maske 0xFFF000F0Multiplikation mit AdditionRd = Ra + Rn * RmArithmetik
mlsRd, Rn, Rm, Ra111110110000 Rn Ra Rd 0001 Rm0xFB000010 / Maske 0xFFF000F0Multiplikation mit SubtraktionRd = Ra - Rn * RmArithmetik
movRd, Rm010001 10 D Rm Rd0x4600 / Maske 0xFF00Kopieren eines Registers (auch r8 bis r15, setzt keine Flags)Rd = RmKonstanten und Adressen laden
movsRd, #imm8auch: mov001 00 Rd imm80x2000 / Maske 0xF800Laden einer Konstanten (8 Bit)Rd = imm8Flags: N ZKonstanten und Adressen laden
movtRd, #imm1611110 i 101100 imm4 0 imm3 Rd imm80xF2C00000 / Maske 0xFBF08000Laden der oberen Hälfte eines Registers (untere Hälfte bleibt)Rd[31:16] = imm4:i:imm3:imm8Konstanten und Adressen laden
movwRd, #imm16auch: mov11110 i 100100 imm4 0 imm3 Rd imm80xF2400000 / Maske 0xFBF08000Laden einer 16-Bit-Konstante (obere Hälfte 0)Rd = zext(imm4:i:imm3:imm8)Konstanten und Adressen laden
mrsRd, sysreg1111001111101111 1000 Rd SYSm0xF3EF8000 / Maske 0xFFFFF000Lesen eines Systemregisters (apsr, ipsr, msp, psp, primask ...)Rd = sysregSystem und Privilegien
msrsysreg, Rn111100111000 Rn 1000 mask 00 SYSm0xF3808000 / Maske 0xFFF0F300Schreiben eines Systemregisterssysreg = RnSystem und Privilegien
mulRd, Rn, Rm111110110000 Rn 1111 Rd 0000 Rm0xFB00F000 / Maske 0xFFF0F0F0Multiplikation (untere 32 Bit)Rd = Rn * RmArithmetik
mulsRdm, Rn, Rdmauch: mul010000 1101 Rn Rdm0x4340 / Maske 0xFFC0Multiplikation (untere 32 Bit)Rdm = Rn * RdmFlags: N ZArithmetik
mvnsRd, Rmauch: mvn010000 1111 Rm Rd0x43C0 / Maske 0xFFC0Bitweise UmkehrungRd = ~RmFlags: N ZLogik und Bits
nop1011 1111 0000 00000xBF00 / Maske 0xFFFFKeine Operationno changeSystem und Privilegien
ornRd, Rn, #constauch: mvn11110 i 0 0011 S Rn 0 imm3 Rd imm80xF0600000 / Maske 0xFBE08000Bitweises ODER mit invertierter Konstante: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn OR ~const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logik und Bits
Rd, Rn, Rm{, shift #imm}auch: mvn1110101 0011 S Rn 0 imm3 Rd imm2 type Rm0xEA600000 / Maske 0xFFE08000Bitweises ODER mit invertiertem Operanden: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn OR ~shift(Rm)Flags: N Z C V (if S)Logik und Bits
orrRd, Rn, #constauch: mov11110 i 0 0010 S Rn 0 imm3 Rd imm80xF0400000 / Maske 0xFBE08000Bitweises ODER: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn OR const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logik und Bits
Rd, Rn, Rm{, shift #imm}auch: mov, lsl, lsr, asr, ror1110101 0010 S Rn 0 imm3 Rd imm2 type Rm0xEA400000 / Maske 0xFFE08000Bitweises ODER: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn OR shift(Rm)Flags: N Z C V (if S)Logik und Bits
orrsRdn, Rmauch: orr010000 1100 Rm Rdn0x4300 / Maske 0xFFC0Bitweises ODERRdn = Rdn OR RmFlags: N ZLogik und Bits
pld[Rn, #imm12]111110001001 Rn 1111 imm120xF890F000 / Maske 0xFFF0F000Vorab-Laden einer Cache-Zeile zum Lesen (Hinweis)prefetch the cache line at Rn + imm12 (a hint)Laden und Speichern
pldw[Rn, #imm12]111110001011 Rn 1111 imm120xF8B0F000 / Maske 0xFFF0F000Vorab-Laden einer Cache-Zeile zum Schreiben (Hinweis)prefetch the cache line at Rn + imm12 (a hint)Laden und Speichern
pli[Rn, #imm12]111110011001 Rn 1111 imm120xF990F000 / Maske 0xFFF0F000Vorab-Laden einer Cache-Zeile für Befehle (Hinweis)prefetch the cache line at Rn + imm12 (a hint)Laden und Speichern
pop{registers{, pc}}1011 110 P register_list0xBC00 / Maske 0xFE00Holen von Registern (P: auch pc, Rücksprung) vom Stackload the registers upward from sp; sp = sp + 4 * countStack
push{registers{, lr}}1011 010 M register_list0xB400 / Maske 0xFE00Ablegen von Registern (M: auch lr) auf dem Stacksp = sp - 4 * count; store the registers upward from spStack
rbitRd, Rm111110101001 Rm 1111 Rd 1010 Rm0xFA90F0A0 / Maske 0xFFF0F0F0Umkehren der BitreihenfolgeRd = reverse_bits(Rm)Logik und Bits
revRd, Rm1011 1010 00 Rm Rd0xBA00 / Maske 0xFFC0Umkehren der Bytes (Little/Big Endian)Rd = reverse_bytes(Rm)Logik und Bits
Rd, Rm111110101001 Rm 1111 Rd 1000 Rm0xFA90F080 / Maske 0xFFF0F0F0Umkehren der Bytes (Little/Big Endian)Rd = reverse_bytes(Rm)Logik und Bits
rev16Rd, Rm1011 1010 01 Rm Rd0xBA40 / Maske 0xFFC0Umkehren der Bytes in jedem HalbwortRd = reverse_bytes_in_each_16_bits(Rm)Logik und Bits
Rd, Rm111110101001 Rm 1111 Rd 1001 Rm0xFA90F090 / Maske 0xFFF0F0F0Umkehren der Bytes in jedem HalbwortRd = reverse_bytes_in_each_16_bits(Rm)Logik und Bits
revshRd, Rm1011 1010 11 Rm Rd0xBAC0 / Maske 0xFFC0Umkehren der unteren zwei Bytes, mit VorzeichenerweiterungRd = sext(reverse_bytes(Rm[15:0]))Logik und Bits
Rd, Rm111110101001 Rm 1111 Rd 1011 Rm0xFA90F0B0 / Maske 0xFFF0F0F0Umkehren der unteren zwei Bytes, mit VorzeichenerweiterungRd = sext(reverse_bytes(Rm[15:0]))Logik und Bits
rorRd, Rn, Rm11111010 0 11 S Rn 1111 Rd 0000 Rm0xFA60F000 / Maske 0xFFE0F0F0Schieben rechts (Rotation) um ein Register (32-Bit-Form)Rd = rotate_right(Rn, Rm[7:0])Flags: N Z C (if S)Schieben und Rotieren
rorsRdn, Rmauch: ror010000 0111 Rm Rdn0x41C0 / Maske 0xFFC0Rotation nach rechts um ein RegisterRdn = rotate_right(Rdn, Rm[7:0])Flags: N Z CSchieben und Rotieren
rsbRd, Rn, #const11110 i 0 1110 S Rn 0 imm3 Rd imm80xF1C00000 / Maske 0xFBE08000Umgekehrte Subtraktion: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = const - Rn; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetik
Rd, Rn, Rm{, shift #imm}1110101 1110 S Rn 0 imm3 Rd imm2 type Rm0xEBC00000 / Maske 0xFFE08000Umgekehrte Subtraktion: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = shift(Rm) - RnFlags: N Z C V (if S)Arithmetik
rsbsRd, Rn, #0auch: neg, rsb010000 1001 Rn Rd0x4240 / Maske 0xFFC0Umgekehrte Subtraktion von 0 (Negation)Rd = 0 - RnFlags: N Z C VArithmetik
sbcRd, Rn, #const11110 i 0 1011 S Rn 0 imm3 Rd imm80xF1600000 / Maske 0xFBE08000Subtraktion mit Borgen: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn - const - (1 - C); the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetik
Rd, Rn, Rm{, shift #imm}1110101 1011 S Rn 0 imm3 Rd imm2 type Rm0xEB600000 / Maske 0xFFE08000Subtraktion mit Borgen: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn - shift(Rm) - (1 - C)Flags: N Z C V (if S)Arithmetik
sbcsRdn, Rmauch: sbc010000 0110 Rm Rdn0x4180 / Maske 0xFFC0Subtraktion mit Borgen (C)Rdn = Rdn - Rm - (1 - C)Flags: N Z C VArithmetik
sbfxRd, Rn, #lsb, #width11110 0 110100 Rn 0 imm3 Rd imm2 0 widthm10xF3400000 / Maske 0xFFF08020Herausholen eines Bitfeldes mit VorzeichenerweiterungRd = sext(Rn[lsb + width - 1 : lsb])Bitfelder
sdivRd, Rn, Rm111110111001 Rn 1111 Rd 1111 Rm0xFB90F0F0 / Maske 0xFFF0F0F0Division mit Vorzeichen (Division durch 0 ergibt 0)Rd = Rn / RmArithmetik
setendle|be10110110 010 E 1 0000xB648 / Maske 0xFFEFEinstellen der Byte-Reihenfolge für Datenzugriffe (E = 0: little endian, 1: big endian; in ARMv8 veraltet)data endianness = ESystem und Privilegien
sev1011 1111 0100 00000xBF40 / Maske 0xFFFFSenden eines Ereignisses an alle Prozessorenset the event register of all processorsSystem und Privilegien
smlalRdLo, RdHi, Rn, Rm111110111100 Rn RdLo RdHi 0000 Rm0xFBC00000 / Maske 0xFFF000F0Multiplikation mit Vorzeichen zu 64 Bit mit AdditionRdHi:RdLo = RdHi:RdLo + sext(Rn) * sext(Rm)Arithmetik
smullRdLo, RdHi, Rn, Rm111110111000 Rn RdLo RdHi 0000 Rm0xFB800000 / Maske 0xFFF000F0Multiplikation mit Vorzeichen zu 64 BitRdHi:RdLo = sext(Rn) * sext(Rm)Arithmetik
stmRn!, {registers}auch: stmia11000 Rn register_list0xC000 / Maske 0xF800Speichern mehrerer Register (aufwärts, Rn wird weitergezählt)for each register in the list: [Rn] = reg; Rn = Rn + 4Laden und Speichern
Rn{!}, {registers}auch: stmia1110100010 W 0 Rn register_list0xE8800000 / Maske 0xFFD00000Speichern mehrerer Register (aufwärts)for each register in the list: [Rn] = reg; Rn = Rn + 4Laden und Speichern
stmdbRn{!}, {registers}auch: push1110100100 W 0 Rn register_list0xE9000000 / Maske 0xFFD00000Speichern mehrerer Register (abwärts; push ist stmdb sp!)for each register in the list, last first: Rn = Rn - 4; [Rn] = regLaden und Speichern
strRt, [Rn, Rm]0101 000 Rm Rn Rt0x5000 / Maske 0xFE00Speichern eines Wortes (Register-Adresse)[Rn + Rm] = RtLaden und Speichern
Rt, [Rn{, #imm5*4}]011 00 imm5 Rn Rt0x6000 / Maske 0xF800Speichern eines Wortes (Konstante als Abstand)[Rn + imm5 * 4] = RtLaden und Speichern
Rt, [sp{, #imm8*4}]100 10 Rt imm80x9000 / Maske 0xF800Speichern eines Wortes relativ zum Stackzeiger[sp + imm8 * 4] = RtLaden und Speichern
Rt, [Rn, #imm12]111110001100 Rn Rt imm120xF8C00000 / Maske 0xFFF00000Speichern eines Wortes (Konstante, 12 Bit, nur vorwärts)[Rn + imm12] = RtLaden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000100 Rn Rt 1 P U W imm80xF8400800 / Maske 0xFFF00800Speichern eines Wortes (Konstante, 8 Bit, mit oder ohne Rückschreiben)[Rn +/- imm8] = RtLaden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110000100 Rn Rt 000000 imm2 Rm0xF8400000 / Maske 0xFFF00FC0Speichern eines Wortes (Register, optional um 0 bis 3 nach links verschoben)[Rn + (Rm << imm2)] = RtLaden und Speichern
strbRt, [Rn, Rm]0101 010 Rm Rn Rt0x5400 / Maske 0xFE00Speichern eines Bytes (Register-Adresse)[Rn + Rm] = Rt[7:0]Laden und Speichern
Rt, [Rn{, #imm5}]011 10 imm5 Rn Rt0x7000 / Maske 0xF800Speichern eines Bytes (Konstante als Abstand)[Rn + imm5] = Rt[7:0]Laden und Speichern
Rt, [Rn, #imm12]111110001000 Rn Rt imm120xF8800000 / Maske 0xFFF00000Speichern eines Bytes (Konstante, 12 Bit, nur vorwärts)[Rn + imm12] = Rt[7:0]Laden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000000 Rn Rt 1 P U W imm80xF8000800 / Maske 0xFFF00800Speichern eines Bytes (Konstante, 8 Bit, mit oder ohne Rückschreiben)[Rn +/- imm8] = Rt[7:0]Laden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110000000 Rn Rt 000000 imm2 Rm0xF8000000 / Maske 0xFFF00FC0Speichern eines Bytes (Register, optional um 0 bis 3 nach links verschoben)[Rn + (Rm << imm2)] = Rt[7:0]Laden und Speichern
strbtRt, [Rn{, #imm8}]111110000000 Rn Rt 1110 imm80xF8000E00 / Maske 0xFFF00F00Speichern eines Bytes mit den Rechten des Anwendungs-Modus[Rn + imm8] = Rt[7:0]Laden und Speichern
strdRt, Rt2, [Rn, #+/-imm8*4]{!} / [Rn], #+/-imm8*41110100 P U 1 W 0 Rn Rt Rt2 imm80xE8400000 / Maske 0xFE500000Speichern eines Registerpaares (zwei Wörter)[addr] = Rt; [addr + 4] = Rt2Laden und Speichern
strexRd, Rt, [Rn{, #imm8*4}]111010000100 Rn Rt Rd imm80xE8400000 / Maske 0xFFF00000Bedingtes Speichern (exklusiv): Rd = 0 bei Erfolgif the exclusive monitor is set then { [Rn + imm8 * 4] = Rt; Rd = 0 } else Rd = 1Laden und Speichern
strexbRd, Rt, [Rn]111010001100 Rn Rt 1111 0100 Rd0xE8C00F40 / Maske 0xFFF00FF0Bedingtes Speichern eines Bytes (exklusiv)if the exclusive monitor is set then { [Rn] = Rt[7:0]; Rd = 0 } else Rd = 1Laden und Speichern
strexdRd, Rt, Rt2, [Rn]111010001100 Rn Rt Rt2 0111 Rd0xE8C00070 / Maske 0xFFF000F0Speichern eines Doppelwortes (exklusiv): nur wenn der Monitor noch gesetzt istif exclusive then [Rn] = Rt:Rt2; Rd = 0 else Rd = 1Laden und Speichern
strexhRd, Rt, [Rn]111010001100 Rn Rt 1111 0101 Rd0xE8C00F50 / Maske 0xFFF00FF0Bedingtes Speichern eines Halbwortes (exklusiv)if the exclusive monitor is set then { [Rn] = Rt[15:0]; Rd = 0 } else Rd = 1Laden und Speichern
strhRt, [Rn, Rm]0101 001 Rm Rn Rt0x5200 / Maske 0xFE00Speichern eines Halbwortes (Register-Adresse)[Rn + Rm] = Rt[15:0]Laden und Speichern
Rt, [Rn{, #imm5*2}]100 00 imm5 Rn Rt0x8000 / Maske 0xF800Speichern eines Halbwortes (Konstante als Abstand)[Rn + imm5 * 2] = Rt[15:0]Laden und Speichern
Rt, [Rn, #imm12]111110001010 Rn Rt imm120xF8A00000 / Maske 0xFFF00000Speichern eines Halbwortes (Konstante, 12 Bit, nur vorwärts)[Rn + imm12] = Rt[15:0]Laden und Speichern
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000010 Rn Rt 1 P U W imm80xF8200800 / Maske 0xFFF00800Speichern eines Halbwortes (Konstante, 8 Bit, mit oder ohne Rückschreiben)[Rn +/- imm8] = Rt[15:0]Laden und Speichern
Rt, [Rn, Rm{, lsl #imm2}]111110000010 Rn Rt 000000 imm2 Rm0xF8200000 / Maske 0xFFF00FC0Speichern eines Halbwortes (Register, optional um 0 bis 3 nach links verschoben)[Rn + (Rm << imm2)] = Rt[15:0]Laden und Speichern
strhtRt, [Rn{, #imm8}]111110000010 Rn Rt 1110 imm80xF8200E00 / Maske 0xFFF00F00Speichern eines Halbwortes mit den Rechten des Anwendungs-Modus[Rn + imm8] = Rt[15:0]Laden und Speichern
strtRt, [Rn{, #imm8}]111110000100 Rn Rt 1110 imm80xF8400E00 / Maske 0xFFF00F00Speichern eines Wortes mit den Rechten des Anwendungs-Modus[Rn + imm8] = RtLaden und Speichern
subsp, sp, #imm7*41011 0000 1 imm70xB080 / Maske 0xFF80Verringerung des Stackzeigerssp = sp - imm7 * 4Arithmetik
Rd, Rn, #constauch: cmp11110 i 0 1101 S Rn 0 imm3 Rd imm80xF1A00000 / Maske 0xFBE08000Subtraktion: Konstante als zweiter Operand (8 Bit, gedreht oder wiederholt)Rd = Rn - const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetik
Rd, Rn, Rm{, shift #imm}auch: cmp1110101 1101 S Rn 0 imm3 Rd imm2 type Rm0xEBA00000 / Maske 0xFFE08000Subtraktion: Register als zweiter Operand, verschoben (lsl, lsr, asr, ror, rrx)Rd = Rn - shift(Rm)Flags: N Z C V (if S)Arithmetik
subsRd, Rn, Rmauch: sub000 11 0 1 Rm Rn Rd0x1A00 / Maske 0xFE00Subtraktion zweier RegisterRd = Rn - RmFlags: N Z C VArithmetik
Rd, Rn, #imm3auch: sub000 11 1 1 imm3 Rn Rd0x1E00 / Maske 0xFE00Subtraktion einer Konstanten (3 Bit)Rd = Rn - imm3Flags: N Z C VArithmetik
Rdn, #imm8auch: sub001 11 Rdn imm80x3800 / Maske 0xF800Subtraktion einer Konstanten (8 Bit)Rdn = Rdn - imm8Flags: N Z C VArithmetik
subwRd, Rn, #imm12auch: sub11110 i 101010 Rn 0 imm3 Rd imm80xF2A00000 / Maske 0xFBF08000Subtraktion einer Konstanten (12 Bit)Rd = Rn - imm12 (i:imm3:imm8)Arithmetik
svc#imm81101 1111 imm80xDF00 / Maske 0xFF00Systemaufruf an das Betriebssystemraise a supervisor call exception with imm8System und Privilegien
sxtabRd, Rn, Rm{, ror #rot}auch: sxtah, sxtab16, uxtab, uxtah, uxtab1611111010 0 op Rn 1111 Rd 1 0 rotate Rm0xFA00F080 / Maske 0xFF80F0C0Erweiterung eines Bytes oder Halbwortes (sxt: mit Vorzeichen, uxt: mit Nullen) und Addition von Rn; ...16: zwei Halbwörter aus zwei Bytes; Rm vorher um 0/8/16/24 gedrehtRd = Rn + extend(ror(Rm, rot))Logik und Bits
sxtbRd, Rm1011 0010 01 Rm Rd0xB240 / Maske 0xFFC0Vorzeichenerweiterung eines BytesRd = sext(Rm[7:0])Logik und Bits
Rd, Rm{, ror #rot}1111101 00100 1111 1111 Rd 10 rotate Rm0xFA4FF080 / Maske 0xFFFFF0C0Vorzeichenerweiterung eines Bytes (32-Bit-Form, Rm zuvor um 0/8/16/24 gedreht)Rd = sext(rotate(Rm)[7:0])Logik und Bits
sxtb16Rd, Rm{, ror #rot}auch: uxtb16111110100 01 U 1111 1111 Rd 1 0 rotate Rm0xFA2FF080 / Maske 0xFFEFF0C0Erweiterung zweier Bytes zu zwei Halbwörtern (sxt: mit Vorzeichen, uxt: mit Nullen); Rm vorher um 0/8/16/24 gedrehtRd = extend(ror(Rm, rot)) per half wordLogik und Bits
sxthRd, Rm1011 0010 00 Rm Rd0xB200 / Maske 0xFFC0Vorzeichenerweiterung eines HalbwortesRd = sext(Rm[15:0])Logik und Bits
Rd, Rm{, ror #rot}1111101 00000 1111 1111 Rd 10 rotate Rm0xFA0FF080 / Maske 0xFFFFF0C0Vorzeichenerweiterung eines Halbwortes (32-Bit-Form, Rm zuvor um 0/8/16/24 gedreht)Rd = sext(rotate(Rm)[15:0])Logik und Bits
tbb[Rn, Rm]111010001101 Rn 1111 0000 000 0 Rm0xE8D0F000 / Maske 0xFFF0FFF0Sprung über eine Tabelle von Byte-Abständenpc = pc + 2 * zext([Rn + Rm])Sprünge und Aufrufe
tbh[Rn, Rm, lsl #1]111010001101 Rn 1111 0000 000 1 Rm0xE8D0F010 / Maske 0xFFF0FFF0Sprung über eine Tabelle von Halbwort-Abständenpc = pc + 2 * zext([Rn + 2 * Rm])Sprünge und Aufrufe
tstRn, Rm010000 1000 Rm Rn0x4200 / Maske 0xFFC0Bitweiser Test (UND), nur die Flags ändern sichflags = Rn & RmFlags: N ZLogik und Bits
ttRd, Rnauch: tta, ttt, ttat111010000100 Rn 1111 Rd A T 0000000xE840F000 / Maske 0xFFF0F03FTest des Zieles einer Adresse (TrustZone: Sicherheitszustand und Zugriffsrechte; A: alternativ, T: unprivilegiert)Rd = security attributes of the address RnSystem und Privilegien
ubfxRd, Rn, #lsb, #width11110 0 111100 Rn 0 imm3 Rd imm2 0 widthm10xF3C00000 / Maske 0xFFF08020Herausholen eines Bitfeldes mit NullenRd = zext(Rn[lsb + width - 1 : lsb])Bitfelder
udf#imm8auch: trap1101 1110 imm80xDE00 / Maske 0xFF00Absichtlich ungültiger Befehl (löst eine Ausnahme aus)raise an undefined instruction exceptionSystem und Privilegien
#imm16111101111111 imm4 1010 imm120xF7F0A000 / Maske 0xFFF0F000Absichtlich ungültiger Befehl (32-Bit-Form)raise an undefined instruction exceptionSystem und Privilegien
udivRd, Rn, Rm111110111011 Rn 1111 Rd 1111 Rm0xFBB0F0F0 / Maske 0xFFF0F0F0Division ohne Vorzeichen (Division durch 0 ergibt 0)Rd = Rn / RmArithmetik
umlalRdLo, RdHi, Rn, Rm111110111110 Rn RdLo RdHi 0000 Rm0xFBE00000 / Maske 0xFFF000F0Multiplikation ohne Vorzeichen zu 64 Bit mit AdditionRdHi:RdLo = RdHi:RdLo + zext(Rn) * zext(Rm)Arithmetik
umullRdLo, RdHi, Rn, Rm111110111010 Rn RdLo RdHi 0000 Rm0xFBA00000 / Maske 0xFFF000F0Multiplikation ohne Vorzeichen zu 64 BitRdHi:RdLo = zext(Rn) * zext(Rm)Arithmetik
uxtbRd, Rm1011 0010 11 Rm Rd0xB2C0 / Maske 0xFFC0Erweiterung eines Bytes mit NullenRd = zext(Rm[7:0])Logik und Bits
Rd, Rm{, ror #rot}1111101 00101 1111 1111 Rd 10 rotate Rm0xFA5FF080 / Maske 0xFFFFF0C0Erweiterung eines Bytes mit Nullen (32-Bit-Form, Rm zuvor um 0/8/16/24 gedreht)Rd = zext(rotate(Rm)[7:0])Logik und Bits
uxthRd, Rm1011 0010 10 Rm Rd0xB280 / Maske 0xFFC0Erweiterung eines Halbwortes mit NullenRd = zext(Rm[15:0])Logik und Bits
Rd, Rm{, ror #rot}1111101 00001 1111 1111 Rd 10 rotate Rm0xFA1FF080 / Maske 0xFFFFF0C0Erweiterung eines Halbwortes mit Nullen (32-Bit-Form, Rm zuvor um 0/8/16/24 gedreht)Rd = zext(rotate(Rm)[15:0])Logik und Bits
vabsVd, Vm11101110 1 D 11 0000 Vd 101 sz 1 1 M 0 Vm0xEEB00AC0 / Maske 0xFFBF0ED0Gleitkomma: Betrag (sz: 0 = Single, 1 = Double)Vd = abs(Vm)Gleitkomma (VFP)
vaddVd, Vn, Vm11101110 0 D 11 Vn Vd 101 sz N 0 M 0 Vm0xEE300A00 / Maske 0xFFB00E50Gleitkomma: Addition (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vn + VmGleitkomma (VFP)
vcmpVd, Vmauch: vcmpe11101110 1 D 11 0100 Vd 101 sz E 1 M 0 Vm0xEEB40A40 / Maske 0xFFBF0E50Gleitkomma: Vergleich zweier Register, setzt die FPSCR-Flags (vcmpe: mit Ausnahme bei NaN; danach vmrs apsr_nzcv, fpscr)fpscr flags = compare(Vd, Vm)Flags: N Z C V (FPSCR)Gleitkomma (VFP)
Vd, #0.0auch: vcmpe11101110 1 D 11 0101 Vd 101 sz E 1 0 0 00000xEEB50A40 / Maske 0xFFBF0E7FGleitkomma: Vergleich mit null, setzt die FPSCR-Flagsfpscr flags = compare(Vd, 0.0)Flags: N Z C V (FPSCR)Gleitkomma (VFP)
vcvtSd, Sm / Dd, Sm11101110 1 D 11 1000 Vd 101 sz op 1 M 0 Vm0xEEB80A40 / Maske 0xFFBF0E50Gleitkomma: Umwandlung einer Ganzzahl in Gleitkomma (op = 1: mit Vorzeichen, 0: ohne)Vd = (float) VmGleitkomma (VFP)
Sd, Sm / Sd, Dmauch: vcvtr11101110 1 D 11 110 x Vd 101 sz op 1 M 0 Vm0xEEBC0A40 / Maske 0xFFBE0E50Gleitkomma: Umwandlung in eine Ganzzahl (x = 1: mit Vorzeichen; op = 1: vcvt, Richtung null; op = 0: vcvtr, nach dem Rundungsmodus)Vd = (int) VmGleitkomma (VFP)
Dd, Sm / Sd, Dm11101110 1 D 11 0111 Vd 101 sz 1 1 M 0 Vm0xEEB70AC0 / Maske 0xFFBF0ED0Gleitkomma: Umwandlung zwischen Single und DoubleVd = convert(Vm)Gleitkomma (VFP)
vdivVd, Vn, Vm11101110 1 D 00 Vn Vd 101 sz N 0 M 0 Vm0xEE800A00 / Maske 0xFFB00E50Gleitkomma: Division (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vn / VmGleitkomma (VFP)
vfmaVd, Vn, Vm11101110 1 D 10 Vn Vd 101 sz N 0 M 0 Vm0xEEA00A00 / Maske 0xFFB00E50Gleitkomma: Verschmolzene Multiplikation mit Addition (ohne Zwischenrundung) (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vd + Vn * VmGleitkomma (VFP)
vfmsVd, Vn, Vm11101110 1 D 10 Vn Vd 101 sz N 1 M 0 Vm0xEEA00A40 / Maske 0xFFB00E50Gleitkomma: Verschmolzene Multiplikation mit Subtraktion (ohne Zwischenrundung) (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vd - Vn * VmGleitkomma (VFP)
vfnmaVd, Vn, Vm11101110 1 D 01 Vn Vd 101 sz N 1 M 0 Vm0xEE900A40 / Maske 0xFFB00E50Gleitkomma: Negierte verschmolzene Multiplikation mit Addition (ohne Zwischenrundung) (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = -Vd - Vn * VmGleitkomma (VFP)
vfnmsVd, Vn, Vm11101110 1 D 01 Vn Vd 101 sz N 0 M 0 Vm0xEE900A00 / Maske 0xFFB00E50Gleitkomma: Negierte verschmolzene Multiplikation mit Subtraktion (ohne Zwischenrundung) (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = -Vd + Vn * VmGleitkomma (VFP)
vldmRn{!}, {Sd | Dd list}auch: vldmia, vpop, fldmiax1110110 0 1 D W 1 Rn Vd 101 sz imm80xEC900A00 / Maske 0xFF900E00Gleitkomma: Laden mehrerer Register ab der Adresse aufsteigend (vldmia; vpop = vldmia sp!; fldmx bei ungerader Zahl)registers = [Rn ...]; optionally Rn = Rn + sizeGleitkomma (VFP)
vldmdbRn!, {Sd | Dd list}auch: fldmdbx1110110 1 0 D 1 1 Rn Vd 101 sz imm80xED300A00 / Maske 0xFFB00E00Gleitkomma: Laden mehrerer Register absteigend unterhalb der Adresse, Rn wird verkleinert (vldmdb)Rn = Rn - size; registers = [Rn ...]Gleitkomma (VFP)
vldrSd|Dd, [Rn{, #+/-imm8*4}]11101101 U D 0 1 Rn Vd 101 sz imm80xED100A00 / Maske 0xFF300E00Gleitkomma: Laden eines Registers aus dem Speicher (sz: 0 = Single, 1 = Double)Vd = [Rn +/- imm8 * 4]Gleitkomma (VFP)
vmlaVd, Vn, Vm11101110 0 D 00 Vn Vd 101 sz N 0 M 0 Vm0xEE000A00 / Maske 0xFFB00E50Gleitkomma: Multiplikation mit Addition zum Ziel (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vd + Vn * VmGleitkomma (VFP)
vmlsVd, Vn, Vm11101110 0 D 00 Vn Vd 101 sz N 1 M 0 Vm0xEE000A40 / Maske 0xFFB00E50Gleitkomma: Multiplikation mit Subtraktion vom Ziel (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vd - Vn * VmGleitkomma (VFP)
vmovVd, Vm11101110 1 D 11 0000 Vd 101 sz 0 1 M 0 Vm0xEEB00A40 / Maske 0xFFBF0ED0Gleitkomma: Kopieren eines Gleitkomma-Registers (sz: 0 = Single, 1 = Double)Vd = VmGleitkomma (VFP)
Sd|Dd, #imm11101110 1 D 11 imm4H Vd 101 sz 0 0 0 0 imm4L0xEEB00A00 / Maske 0xFFB00EF0Gleitkomma: Laden einer Konstante (8 Bit kodiert, +-(16..31)/16 * 2^(-3..4))Vd = constantGleitkomma (VFP)
Sn, Rt / Rt, Sn11101110 000 op Vn Rt 1010 N 00 1 00000xEE000A10 / Maske 0xFFE00F7FGleitkomma: Kopieren zwischen einem Ganzzahl-Register und einem Single-Register (bitweise)Rt = bits(Sn) or Sn = bits(Rt)Gleitkomma (VFP)
Sm, Sm1, Rt, Rt2 / Dm, Rt, Rt211101100 010 op Rt2 Rt 101 sz 0 0 M 1 Vm0xEC400A10 / Maske 0xFFE00ED0Gleitkomma: Kopieren zwischen zwei Ganzzahl-Registern und zwei Single- oder einem Double-RegisterDm = Rt2:Rt or Rt:Rt2 = DmGleitkomma (VFP)
Dd[x], Rt / Rt, Dn[x]11101110 0 0 x L Vn Rt 1011 N 00 1 00000xEE000B10 / Maske 0xFFC00F7FGleitkomma: Kopieren eines 32-Bit-Wortes zwischen einem Ganzzahl-Register und der Hälfte eines Double-RegistersDd[x] = Rt or Rt = Dn[x]Gleitkomma (VFP)
vmrsRt, FPSID|FPSCR111011101111 000 x Rt 1010 0001 00000xEEF00A10 / Maske 0xFFFE0FFFKopieren eines Gleitkomma-Systemregisters in ein Ganzzahl-Register (mit Rt = pc: in die APSR-Flags)Rt = system registerGleitkomma (VFP)
vmsrFPSID|FPSCR, Rt111011101110 000 x Rt 1010 0001 00000xEEE00A10 / Maske 0xFFFE0FFFKopieren eines Ganzzahl-Registers in ein Gleitkomma-Systemregistersystem register = RtGleitkomma (VFP)
vmulVd, Vn, Vm11101110 0 D 10 Vn Vd 101 sz N 0 M 0 Vm0xEE200A00 / Maske 0xFFB00E50Gleitkomma: Multiplikation (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vn * VmGleitkomma (VFP)
vnegVd, Vm11101110 1 D 11 0001 Vd 101 sz 0 1 M 0 Vm0xEEB10A40 / Maske 0xFFBF0ED0Gleitkomma: Vorzeichenwechsel (sz: 0 = Single, 1 = Double)Vd = -VmGleitkomma (VFP)
vnmlaVd, Vn, Vm11101110 0 D 01 Vn Vd 101 sz N 1 M 0 Vm0xEE100A40 / Maske 0xFFB00E50Gleitkomma: Negierte Multiplikation mit Addition (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = -Vd - Vn * VmGleitkomma (VFP)
vnmlsVd, Vn, Vm11101110 0 D 01 Vn Vd 101 sz N 0 M 0 Vm0xEE100A00 / Maske 0xFFB00E50Gleitkomma: Negierte Multiplikation mit Subtraktion (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = -Vd + Vn * VmGleitkomma (VFP)
vnmulVd, Vn, Vm11101110 0 D 10 Vn Vd 101 sz N 1 M 0 Vm0xEE200A40 / Maske 0xFFB00E50Gleitkomma: Negierte Multiplikation (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = -(Vn * Vm)Gleitkomma (VFP)
vsqrtVd, Vm11101110 1 D 11 0001 Vd 101 sz 1 1 M 0 Vm0xEEB10AC0 / Maske 0xFFBF0ED0Gleitkomma: Quadratwurzel (sz: 0 = Single, 1 = Double)Vd = sqrt(Vm)Gleitkomma (VFP)
vstmRn{!}, {Sd | Dd list}auch: vstmia, fstmiax1110110 0 1 D W 0 Rn Vd 101 sz imm80xEC800A00 / Maske 0xFF900E00Gleitkomma: Speichern mehrerer Register ab der Adresse aufsteigend (vstmia; fstmx bei ungerader Zahl)[Rn ...] = registers; optionally Rn = Rn + sizeGleitkomma (VFP)
vstmdbRn!, {Sd | Dd list}auch: vpush, fstmdbx1110110 1 0 D 1 0 Rn Vd 101 sz imm80xED200A00 / Maske 0xFFB00E00Gleitkomma: Speichern mehrerer Register absteigend unterhalb der Adresse, Rn wird verkleinert (vstmdb; vpush = vstmdb sp!)Rn = Rn - size; [Rn ...] = registersGleitkomma (VFP)
vstrSd|Dd, [Rn{, #+/-imm8*4}]11101101 U D 0 0 Rn Vd 101 sz imm80xED000A00 / Maske 0xFF300E00Gleitkomma: Speichern eines Registers in den Speicher (sz: 0 = Single, 1 = Double)[Rn +/- imm8 * 4] = VdGleitkomma (VFP)
vsubVd, Vn, Vm11101110 0 D 11 Vn Vd 101 sz N 1 M 0 Vm0xEE300A40 / Maske 0xFFB00E50Gleitkomma: Subtraktion (sz = 0: Single, Sd/Sn/Sm; sz = 1: Double, Dd/Dn/Dm)Vd = Vn - VmGleitkomma (VFP)
wfe1011 1111 0010 00000xBF20 / Maske 0xFFFFWarten auf ein Ereignissleep until an eventSystem und Privilegien
wfi1011 1111 0011 00000xBF30 / Maske 0xFFFFWarten auf einen Interruptsleep until an interruptSystem und Privilegien
yield1011 1111 0001 00000xBF10 / Maske 0xFFFFHinweis: Warteschleife, der Prozessor darf zu einem anderen Thread wechselnno change (a hint)System und Privilegien