Xtensa-Befehle (ESP32-S3, ESP32)

Befehlsreferenz: i386 · x64 · ARM32 (Thumb-2) · ARM64 (AArch64) · RISC-V (RV32) · Xtensa

224 Befehle für .arch xtensa: Name, Operanden, die Bitkodierung (24 Bit, bei den kurzen Befehlen 16 Bit) und eine kurze Beschreibung mit der Wirkung als Pseudocode. Enthalten ist, was die Kerne des ESP32-S3 (Xtensa LX7) für gewöhnliche Programme ausführen: die Grundbefehle, die 16-Bit-Befehle (Code Density), die Registerfenster, die Schleifen ohne Zusatzaufwand, Multiplikation und Division, Minimum und Maximum, die booleschen Register, die Gleitkommabefehle (einfache Genauigkeit), die Spezial- und Benutzerregister und die Befehle für Ausnahmen, Interrupts und den Debugger. Der ESP32 (Xtensa LX6) hat dieselben Kodierungen; nur salt und saltu fehlen ihm (sie sind markiert). Nicht enthalten sind die Vektorbefehle des ESP32-S3 (ee.*) und MAC16.

So liest du die Tabelle

Ein Xtensa-Befehl hat 24 Bit (drei Bytes) oder 16 Bit; welches, sagen die untersten 4 Bit (op0): 0 bis 7 sind 24 Bit, 8 bis 13 die 16-Bit-Befehle mit .n im Namen. Im Speicher steht das unterste Byte zuerst. Die Kodierung zeigt die Bits von links (höchste Bit-Nummer) nach rechts: feste Bits als Ziffern, die Namen sind Felder; mit der Maus auf einem Feld steht der Bereich der Bits. Die Register stehen in drei Feldern zu 4 Bit, r (Bits 15 bis 12), s (11 bis 8) und t (7 bis 4): ar, as, at sind Adressregister a0 bis a15, fr … Gleitkommaregister f0 bis f15, br … boolesche Register b0 bis b15. Darunter stehen der Wert der festen Bits und die Maske in Hex: Ein Befehl gehört zu dieser Form, wenn (Wort & Maske) == Wert ist.

Registerfenster. Die 16 Register a0 bis a15 sind ein Fenster auf 64 Register. call8 merkt sich die Rücksprungadresse und den Wunsch, das Fenster um 8 zu drehen; der erste Befehl der Funktion, entry, dreht es und legt den Stack an. Danach sind a10 bis a15 des Aufrufers die a2 bis a7 der Funktion (die Argumente), a1 ist der Stackpointer, a0 die Rücksprungadresse, deren oberste zwei Bits die Drehung sagen. retw dreht zurück. Ohne Fenster arbeiten call0 und ret.

Konstanten. movi lädt 12 Bit mit Vorzeichen, movi.n -32 bis 95. Größere Konstanten und Adressen kommen mit l32r aus einem Literal-Pool: einem Wort mit dd, das vor dem Befehl steht (bis zu 256 KB davor, seine Adresse durch 4 teilbar). Die Verzweigungen mit einer Konstanten (beqi, bltui …) nehmen nur die 16 Werte der Tabelle b4const oder b4constu. Wie GNU as schreibt Asmonite die 16-Bit-Form, wenn die Operanden passen (add wird add.n, l32i mit kleinem Offset l32i.n …).

Jede Kodierung in dieser Tabelle ist gegen den Zerleger von Asmonite geprüft (mit zufälligen Werten für die Felder ergibt sie wieder diesen Befehl), und der Zerleger gegen GNU objdump von Espressif (über eine Million Befehlswörter, ohne Abweichung). Die Spezialregister (rsr.ps a3, wsr.epc6 a2 …) sind die des ESP32-S3; beim ESP32 sind es fast dieselben. Der Pseudocode ist wie Quelltext englisch geschrieben, auch auf der deutschen Seite; <s und <u vergleichen mit und ohne Vorzeichen, mem32[x] ist das Wort im Speicher an der Adresse x.

BefehlOperandenKodierungBeschreibung
absar, at01100000 ar 0001 at 00000x600100 / Maske 0xFF0F0FBetragar = |at|Arithmetik
abs.sfr, fs11111010 fr fs 000100000xFA0010 / Maske 0xFF00FFGleitkomma-Betragfr = |fs|Gleitkomma (skalar)
addar, as, at10000000 ar as at 00000x800000 / Maske 0xFF000FAddition zweier Registerar = as + atArithmetik
add.nar, as, atar as at 10100x000A / Maske 0x000FAddition zweier Register (16 Bit)ar = as + at16-Bit-Befehle (Code Density)
add.sfr, fs, ft00001010 fr fs ft 00000x0A0000 / Maske 0xFF000FGleitkomma-Additionfr = fs + ftGleitkomma (skalar)
addexp.sfr, fs11111010 fr fs 111000000xFA00E0 / Maske 0xFF00FFExponenten addieren (Schritt der Division und Wurzel)Gleitkomma (skalar)
addexpm.sfr, fs11111010 fr fs 111100000xFA00F0 / Maske 0xFF00FFExponenten addieren, aus der Mantisse (Schritt der Division und Wurzel)Gleitkomma (skalar)
addiat, as, imm8imm8 1100 as at 00100x00C002 / Maske 0x00F00FAddition einer Konstanten (8 Bit mit Vorzeichen); mit -1 oder 1..15 wird daraus addi.n, mit 0 mov.nat = as + sext(imm8)Arithmetik
addi.nar, as, immar as imm4 10110x000B / Maske 0x000FAddition einer Konstanten -1 oder 1..15 (16 Bit; das Feld 0 ist -1)ar = as + imm16-Bit-Befehle (Code Density)
addmiat, as, immimm8 1101 as at 00100x00D002 / Maske 0x00F00FAddition einer Konstanten mal 256 (-32768..32512)at = as + (sext(imm8) << 8)Arithmetik
addx2ar, as, at10010000 ar as at 00000x900000 / Maske 0xFF000FAddition, das erste Register mal 2 (Adresse eines Halbworts)ar = (as << 1) + atArithmetik
addx4ar, as, at10100000 ar as at 00000xA00000 / Maske 0xFF000FAddition, das erste Register mal 4 (Adresse eines Worts)ar = (as << 2) + atArithmetik
addx8ar, as, at10110000 ar as at 00000xB00000 / Maske 0xFF000FAddition, das erste Register mal 8ar = (as << 3) + atArithmetik
all4bt, bs000000001001 bs bt 00000x009000 / Maske 0xFFF00F1, wenn alle 4 booleschen Register 1 sindbt = bs & bs+1 & bs+2 & bs+3Boolesche Register
all8bt, bs000000001011 bs bt 00000x00B000 / Maske 0xFFF00F1, wenn alle 8 booleschen Register 1 sindbt = bs & ... & bs+7Boolesche Register
andar, as, at00010000 ar as at 00000x100000 / Maske 0xFF000FUNDar = as & atLogik und Bits
andbbr, bs, bt00000010 br bs bt 00000x020000 / Maske 0xFF000FUND boolescher Registerbr = bs & btBoolesche Register
andbcbr, bs, bt00010010 br bs bt 00000x120000 / Maske 0xFF000FUND mit dem Gegenteil des zweitenbr = bs & ~btBoolesche Register
any4bt, bs000000001000 bs bt 00000x008000 / Maske 0xFFF00F1, wenn eins von 4 booleschen Registern 1 ist (die Gruppe ab b0, b4, b8, b12)bt = bs | bs+1 | bs+2 | bs+3Boolesche Register
any8bt, bs000000001010 bs bt 00000x00A000 / Maske 0xFFF00F1, wenn eins von 8 booleschen Registern 1 ist (ab b0 oder b8)bt = bs | ... | bs+7Boolesche Register
ballas, at, labelimm8 0100 as at 01110x004007 / Maske 0x00F00FVerzweigen, wenn alle Bits der Maske gesetzt sindif (~as & at) == 0: pc = labelSprünge und Aufrufe
banyas, at, labelimm8 1000 as at 01110x008007 / Maske 0x00F00FVerzweigen, wenn eins der Bits der Maske gesetzt istif (as & at) != 0: pc = labelSprünge und Aufrufe
bbcas, at, labelimm8 0101 as at 01110x005007 / Maske 0x00F00FVerzweigen, wenn das Bit (Nummer im Register) 0 istif as[at & 31] == 0: pc = labelSprünge und Aufrufe
bbcias, bit, labelimm8 011 bit[4] as bit[3-0] 01110x006007 / Maske 0x00E00FVerzweigen, wenn das Bit (Konstante 0..31) 0 istif as[bit] == 0: pc = labelSprünge und Aufrufe
bbsas, at, labelimm8 1101 as at 01110x00D007 / Maske 0x00F00FVerzweigen, wenn das Bit (Nummer im Register) 1 istif as[at & 31] == 1: pc = labelSprünge und Aufrufe
bbsias, bit, labelimm8 111 bit[4] as bit[3-0] 01110x00E007 / Maske 0x00E00FVerzweigen, wenn das Bit (Konstante 0..31) 1 istif as[bit] == 1: pc = labelSprünge und Aufrufe
beqas, at, labelimm8 0001 as at 01110x001007 / Maske 0x00F00FVerzweigen, wenn gleich (-128..127 Byte weit)if as == at: pc = labelSprünge und Aufrufe
beqias, b4const, labelimm8 r as 001001100x000026 / Maske 0x0000FFVerzweigen, wenn gleich einer Konstanten (-1, 1..8, 10, 12, 16, 32, 64, 128, 256)if as == b4const: pc = labelSprünge und Aufrufe
beqzas, labelimm12 as 000101100x000016 / Maske 0x0000FFVerzweigen, wenn 0 (bis 2 KB weit)if as == 0: pc = labelSprünge und Aufrufe
beqz.nas, labelimm[3-0] as 10 imm[5-4] 11000x008C / Maske 0x00CFVerzweigen, wenn 0, nur vorwärts 0..63 Byte (16 Bit)if as == 0: pc = label16-Bit-Befehle (Code Density)
bfbs, labelimm8 0000 bs 011101100x000076 / Maske 0x00F0FFVerzweigen, wenn das boolesche Register 0 istif not bs: pc = labelBoolesche Register
bgeas, at, labelimm8 1010 as at 01110x00A007 / Maske 0x00F00FVerzweigen, wenn größer oder gleich (mit Vorzeichen)if as >=s at: pc = labelSprünge und Aufrufe
bgeias, b4const, labelimm8 r as 111001100x0000E6 / Maske 0x0000FFVerzweigen, wenn größer oder gleich einer Konstanten (mit Vorzeichen)if as >=s b4const: pc = labelSprünge und Aufrufe
bgeuas, at, labelimm8 1011 as at 01110x00B007 / Maske 0x00F00FVerzweigen, wenn größer oder gleich (ohne Vorzeichen)if as >=u at: pc = labelSprünge und Aufrufe
bgeuias, b4constu, labelimm8 r as 111101100x0000F6 / Maske 0x0000FFVerzweigen, wenn größer oder gleich einer Konstanten ohne Vorzeichenif as >=u b4constu: pc = labelSprünge und Aufrufe
bgezas, labelimm12 as 110101100x0000D6 / Maske 0x0000FFVerzweigen, wenn nicht negativif as >=s 0: pc = labelSprünge und Aufrufe
bltas, at, labelimm8 0010 as at 01110x002007 / Maske 0x00F00FVerzweigen, wenn kleiner (mit Vorzeichen)if as <s at: pc = labelSprünge und Aufrufe
bltias, b4const, labelimm8 r as 101001100x0000A6 / Maske 0x0000FFVerzweigen, wenn kleiner als eine Konstante (mit Vorzeichen)if as <s b4const: pc = labelSprünge und Aufrufe
bltuas, at, labelimm8 0011 as at 01110x003007 / Maske 0x00F00FVerzweigen, wenn kleiner (ohne Vorzeichen)if as <u at: pc = labelSprünge und Aufrufe
bltuias, b4constu, labelimm8 r as 101101100x0000B6 / Maske 0x0000FFVerzweigen, wenn kleiner als eine Konstante ohne Vorzeichen (2..8, 10, 12, 16, 32, 64, 128, 256, 32768, 65536)if as <u b4constu: pc = labelSprünge und Aufrufe
bltzas, labelimm12 as 100101100x000096 / Maske 0x0000FFVerzweigen, wenn negativif as <s 0: pc = labelSprünge und Aufrufe
bnallas, at, labelimm8 1100 as at 01110x00C007 / Maske 0x00F00FVerzweigen, wenn nicht alle Bits der Maske gesetzt sindif (~as & at) != 0: pc = labelSprünge und Aufrufe
bneas, at, labelimm8 1001 as at 01110x009007 / Maske 0x00F00FVerzweigen, wenn ungleichif as != at: pc = labelSprünge und Aufrufe
bneias, b4const, labelimm8 r as 011001100x000066 / Maske 0x0000FFVerzweigen, wenn ungleich einer Konstantenif as != b4const: pc = labelSprünge und Aufrufe
bnezas, labelimm12 as 010101100x000056 / Maske 0x0000FFVerzweigen, wenn nicht 0if as != 0: pc = labelSprünge und Aufrufe
bnez.nas, labelimm[3-0] as 11 imm[5-4] 11000x00CC / Maske 0x00CFVerzweigen, wenn nicht 0, nur vorwärts 0..63 Byte (16 Bit)if as != 0: pc = label16-Bit-Befehle (Code Density)
bnoneas, at, labelimm8 0000 as at 01110x000007 / Maske 0x00F00FVerzweigen, wenn keins der Bits der Maske gesetzt istif (as & at) == 0: pc = labelSprünge und Aufrufe
breakimm4, imm4000000000100 imm4 00000x004000 / Maske 0xFFF00FHaltepunkt: hält im Debugger an (Debug-Ausnahme), die Zahlen sagen dem Handler den GrundSystem und Privilegien
break.nimm41111 imm4 001011010xF02D / Maske 0xF0FFHaltepunkt (16 Bit); Asmonite setzt ihn für Haltepunkte auf 16-Bit-Befehle16-Bit-Befehle (Code Density)
btbs, labelimm8 0001 bs 011101100x001076 / Maske 0x00F0FFVerzweigen, wenn das boolesche Register 1 istif bs: pc = labelBoolesche Register
call0labeloffset 0001010x000005 / Maske 0x00003FAufruf ohne Registerfenster: die Rücksprungadresse in a0 (das Ziel durch 4 teilbar)a0 = pc + 3; pc = labelSprünge und Aufrufe
call12labeloffset 1101010x000035 / Maske 0x00003FAufruf, der das Registerfenster um 12 drehta12 = return address (top bits: 3); PS.CALLINC = 3; pc = labelRegisterfenster (call4/8/12, entry, retw)
call4labeloffset 0101010x000015 / Maske 0x00003FAufruf, der das Registerfenster um 4 dreht (wenn die Funktion entry ausführt): a4..a7 des Aufrufers sind ihre a0..a3a4 = return address (top bits: 1); PS.CALLINC = 1; pc = labelRegisterfenster (call4/8/12, entry, retw)
call8labeloffset 1001010x000025 / Maske 0x00003FAufruf, der das Registerfenster um 8 dreht: a10..a15 des Aufrufers sind die Argumente a2..a7 der Funktiona8 = return address (top bits: 2); PS.CALLINC = 2; pc = labelRegisterfenster (call4/8/12, entry, retw)
callx0as000000000000 as 110000000x0000C0 / Maske 0xFFF0FFAufruf der Adresse im Register, ohne Registerfenstera0 = pc + 3; pc = asSprünge und Aufrufe
callx12as000000000000 as 111100000x0000F0 / Maske 0xFFF0FFcall12 an die Adresse im Registera12 = return address; PS.CALLINC = 3; pc = asRegisterfenster (call4/8/12, entry, retw)
callx4as000000000000 as 110100000x0000D0 / Maske 0xFFF0FFcall4 an die Adresse im Registera4 = return address; PS.CALLINC = 1; pc = asRegisterfenster (call4/8/12, entry, retw)
callx8as000000000000 as 111000000x0000E0 / Maske 0xFFF0FFcall8 an die Adresse im Registera8 = return address; PS.CALLINC = 2; pc = asRegisterfenster (call4/8/12, entry, retw)
ceil.sar, fs, imm410111010 ar fs imm4 00000xBA0000 / Maske 0xFF000FIn eine Ganzzahl wandeln, aufgerundetar = ceil(fs * 2^imm4)Gleitkomma (skalar)
clampsar, as, bits00110011 ar as b-7 00000x330000 / Maske 0xFF000FBegrenzen auf den Bereich einer Zahl mit b+1 Bit (7..22) mit Vorzeichenar = min(max(as, -2^b), 2^b - 1)Arithmetik
const.sfr, imm411111010 fr imm4 001100000xFA0030 / Maske 0xFF00FFEine Gleitkomma-Konstante laden (0, 1, 2, 0.5 ... nach imm4)fr = constant[imm4]Gleitkomma (skalar)
div0.sfr, fs11111010 fr fs 011100000xFA0070 / Maske 0xFF00FFAnfangswert für eine DivisionGleitkomma (skalar)
divn.sfr, fs, ft01111010 fr fs ft 00000x7A0000 / Maske 0xFF000FLetzter Schritt einer Division (nach div0.s, nexp01.s ...)Gleitkomma (skalar)
dsync0000000000100000001100000x002030 / Maske 0xFFFFFFWarten, bis geschriebene Spezialregister für Speicherzugriffe geltenSchranken und Sonstiges
entryas, framesizeimm12 as 001101100x000036 / Maske 0x0000FFDer erste Befehl einer Funktion mit Registerfenster: dreht das Fenster um PS.CALLINC * 4 und legt den Stack an (framesize 0..32760, durch 8 teilbar; die Adresse durch 4 teilbar)WINDOWBASE += PS.CALLINC; as = as(old window) - framesizeRegisterfenster (call4/8/12, entry, retw)
esync0000000000100000001000000x002020 / Maske 0xFFFFFFWarten, bis geschriebene Spezialregister für die Ausführung geltenSchranken und Sonstiges
excw0000000000100000100000000x002080 / Maske 0xFFFFFFWarten, bis die Ausnahmen der vorigen Befehle ausgelöst sindSchranken und Sonstiges
extuiar, at, shift, widthw-1 010 sh[4] ar sh[3-0] at 00000x040000 / Maske 0x0E000FEin Bitfeld ohne Vorzeichen holen: width Bit ab Bit shift (shift + width bis 32)ar = (at >> shift) & ((1 << width) - 1)Schieben und Rotieren
extw0000000000100000110100000x0020D0 / Maske 0xFFFFFFWarten, bis alle früheren Zugriffe außen angekommen sindSchranken und Sonstiges
float.sfr, as, imm411001010 fr as imm4 00000xCA0000 / Maske 0xFF000FGanzzahl mit Vorzeichen in Gleitkomma wandeln, geteilt durch 2^imm4fr = float(as) / 2^imm4Gleitkomma (skalar)
floor.sar, fs, imm410101010 ar fs imm4 00000xAA0000 / Maske 0xFF000FIn eine Ganzzahl wandeln, abgerundetar = floor(fs * 2^imm4)Gleitkomma (skalar)
idtlbas010100001100 as 000000000x50C000 / Maske 0xFFF0FFEintrag des Daten-TLB ungültig macheninvalidate DTLB[as]System und Privilegien
iitlbas010100000100 as 000000000x504000 / Maske 0xFFF0FFEintrag des Befehls-TLB ungültig macheninvalidate ITLB[as]System und Privilegien
ill0000000000000000000000000x000000 / Maske 0xFFFFFFUngültiger Befehl: löst eine Ausnahme ausSystem und Privilegien
ill.n11110000011011010xF06D / Maske 0xFFFFUngültiger Befehl (16 Bit)16-Bit-Befehle (Code Density)
isync0000000000100000000000000x002000 / Maske 0xFFFFFFBefehle neu holen (nach geändertem Code oder geänderten Spezialregistern)Schranken und Sonstiges
jlabeloffset 0001100x000006 / Maske 0x00003FSprung (bis 128 KB weit)pc = labelSprünge und Aufrufe
jxas000000000000 as 101000000x0000A0 / Maske 0xFFF0FFSprung an die Adresse im Registerpc = asSprünge und Aufrufe
l16siat, as, offsetimm8 1001 as at 00100x009002 / Maske 0x00F00FLaden eines Halbworts mit Vorzeichenat = sext(mem16[as + (imm8 << 1)])Laden und Speichern
l16uiat, as, offsetimm8 0001 as at 00100x001002 / Maske 0x00F00FLaden eines Halbworts ohne Vorzeichen (Offset 0..510, gerade)at = zext(mem16[as + (imm8 << 1)])Laden und Speichern
l32aiat, as, offsetimm8 1011 as at 00100x00B002 / Maske 0x00F00FLaden eines Worts mit Acquire-Ordnung (spätere Zugriffe erst danach)at = mem32[as + (imm8 << 2)]; acquireLaden und Speichern
l32eat, as, offset00001001 imm4 as at 00000x090000 / Maske 0xFF000FLaden für die Handler der Fensterausnahmen (Offset -64..-4)at = mem32[as + ((imm4 << 2) - 64)]Registerfenster (call4/8/12, entry, retw)
l32iat, as, offsetimm8 0010 as at 00100x002002 / Maske 0x00F00FLaden eines Worts (Offset 0..1020, durch 4 teilbar); mit kleinem Offset wird daraus l32i.nat = mem32[as + (imm8 << 2)]Laden und Speichern
l32i.nat, as, offsetimm4 as at 10000x0008 / Maske 0x000FLaden eines Worts, Offset 0..60 (16 Bit)at = mem32[as + (imm4 << 2)]16-Bit-Befehle (Code Density)
l32rat, labelimm16 at 00010x000001 / Maske 0x00000FLaden eines Worts aus dem Literal-Pool: einer Konstanten, die bis zu 256 KB vor dem Befehl steht (die Adresse durch 4 teilbar); so kommen 32-Bit-Konstanten in ein Registerat = mem32[((pc + 3) & ~3) + (0xFFFF0000 | imm16) * 4]Laden und Speichern
l8uiat, as, imm8imm8 0000 as at 00100x000002 / Maske 0x00F00FLaden eines Bytes ohne Vorzeichenat = zext(mem8[as + imm8])Laden und Speichern
lddr32.pas000000000111 as 111000000x0070E0 / Maske 0xFFF0FFDebug-Modus: ein Wort nach DDR laden und die Adresse um 4 erhöhen (schnelles Lesen des Speichers durch den Debugger)DDR = mem32[as]; as += 4System und Privilegien
loopas, labelimm8 1000 as 011101100x008076 / Maske 0x00F0FFSchleife ohne Zusatzaufwand: der Teil bis label läuft as-mal (as = 0: 2^32-mal); LBEG, LEND, LCOUNTLCOUNT = as - 1; LBEG = pc + 3; LEND = labelSchleifen ohne Zusatzaufwand (loop)
loopgtzas, labelimm8 1010 as 011101100x00A076 / Maske 0x00F0FFSchleife wie loop, übersprungen, wenn as nicht größer als 0 istif as <=s 0: pc = label else loopSchleifen ohne Zusatzaufwand (loop)
loopnezas, labelimm8 1001 as 011101100x009076 / Maske 0x00F0FFSchleife wie loop, bei as = 0 übersprungenif as == 0: pc = label else loopSchleifen ohne Zusatzaufwand (loop)
lsift, as, offsetimm8 0000 as ft 00110x000003 / Maske 0x00F00FGleitkommazahl ladenft = mem32[as + (imm8 << 2)]Gleitkomma (skalar)
lsipft, as, offsetimm8 1000 as ft 00110x008003 / Maske 0x00F00FGleitkommazahl laden, dann die Adresse erhöhenft = mem32[as]; as += imm8 << 2Gleitkomma (skalar)
lsxfr, as, at00001000 fr as at 00000x080000 / Maske 0xFF000FGleitkommazahl laden, Adresse aus zwei Registernfr = mem32[as + at]Gleitkomma (skalar)
lsxpfr, as, at00011000 fr as at 00000x180000 / Maske 0xFF000FGleitkommazahl laden, dann die Adresse erhöhenfr = mem32[as]; as += atGleitkomma (skalar)
madd.sfr, fs, ft01001010 fr fs ft 00000x4A0000 / Maske 0xFF000FMultiplizieren und addierenfr = fr + fs * ftGleitkomma (skalar)
maddn.sfr, fs, ft01101010 fr fs ft 00000x6A0000 / Maske 0xFF000FMultiplizieren und addieren, gerundet zur nächsten Zahl (ein Schritt der Division und Wurzel)fr = round(fr + fs * ft)Gleitkomma (skalar)
maxar, as, at01010011 ar as at 00000x530000 / Maske 0xFF000FMaximum mit Vorzeichenar = (as >s at) ? as : atVergleichen und Tauschen
maxuar, as, at01110011 ar as at 00000x730000 / Maske 0xFF000FMaximum ohne Vorzeichenar = (as >u at) ? as : atVergleichen und Tauschen
memw0000000000100000110000000x0020C0 / Maske 0xFFFFFFSpeicherschranke: frühere Zugriffe vor späteren (für Peripherieregister)Schranken und Sonstiges
minar, as, at01000011 ar as at 00000x430000 / Maske 0xFF000FMinimum mit Vorzeichenar = (as <s at) ? as : atVergleichen und Tauschen
minuar, as, at01100011 ar as at 00000x630000 / Maske 0xFF000FMinimum ohne Vorzeichenar = (as <u at) ? as : atVergleichen und Tauschen
mkdadj.sfr, fs11111010 fr fs 110100000xFA00D0 / Maske 0xFF00FFExponentenkorrektur für die Division bildenGleitkomma (skalar)
mksadj.sfr, fs11111010 fr fs 110000000xFA00C0 / Maske 0xFF00FFExponentenkorrektur für die Quadratwurzel bildenGleitkomma (skalar)
mov.nat, as0000 as at 11010x000D / Maske 0xF00FKopieren eines Registers (16 Bit)at = as16-Bit-Befehle (Code Density)
mov.sfr, fs11111010 fr fs 000000000xFA0000 / Maske 0xFF00FFGleitkommaregister kopierenfr = fsGleitkomma (skalar)
moveqzar, as, at10000011 ar as at 00000x830000 / Maske 0xFF000FKopieren, wenn das dritte Register 0 istif at == 0: ar = asBedingte Auswahl
moveqz.sfr, fs, at10001011 fr fs at 00000x8B0000 / Maske 0xFF000FGleitkommaregister kopieren, wenn at 0 istif at == 0: fr = fsGleitkomma (skalar)
movfar, as, bt11000011 ar as bt 00000xC30000 / Maske 0xFF000FKopieren, wenn das boolesche Register 0 istif not bt: ar = asBedingte Auswahl
movf.sfr, fs, bt11001011 fr fs bt 00000xCB0000 / Maske 0xFF000FGleitkommaregister kopieren, wenn das boolesche Register 0 istif not bt: fr = fsGleitkomma (skalar)
movgezar, as, at10110011 ar as at 00000xB30000 / Maske 0xFF000FKopieren, wenn das dritte Register nicht negativ istif at >=s 0: ar = asBedingte Auswahl
movgez.sfr, fs, at10111011 fr fs at 00000xBB0000 / Maske 0xFF000FGleitkommaregister kopieren, wenn at nicht negativ istif at >=s 0: fr = fsGleitkomma (skalar)
moviat, imm12imm[7-0] 1010 imm[11-8] at 00100x00A002 / Maske 0x00F00FLaden einer Konstanten (12 Bit mit Vorzeichen, -2048..2047); größere kommen mit l32rat = sext(imm12)Konstanten und Adressen laden
movi.nas, imm7imm[3-0] as 0 imm[6-4] 11000x000C / Maske 0x008FLaden einer Konstanten -32..95 (16 Bit)as = imm716-Bit-Befehle (Code Density)
movltzar, as, at10100011 ar as at 00000xA30000 / Maske 0xFF000FKopieren, wenn das dritte Register negativ istif at <s 0: ar = asBedingte Auswahl
movltz.sfr, fs, at10101011 fr fs at 00000xAB0000 / Maske 0xFF000FGleitkommaregister kopieren, wenn at negativ istif at <s 0: fr = fsGleitkomma (skalar)
movnezar, as, at10010011 ar as at 00000x930000 / Maske 0xFF000FKopieren, wenn das dritte Register nicht 0 istif at != 0: ar = asBedingte Auswahl
movnez.sfr, fs, at10011011 fr fs at 00000x9B0000 / Maske 0xFF000FGleitkommaregister kopieren, wenn at nicht 0 istif at != 0: fr = fsGleitkomma (skalar)
movspat, as000000000001 as at 00000x001000 / Maske 0xFFF00FDen Stackpointer setzen, so dass Registerfenster der Aufrufer zuerst gespeichert werdenat = as (after spilling the windows when needed)Registerfenster (call4/8/12, entry, retw)
movtar, as, bt11010011 ar as bt 00000xD30000 / Maske 0xFF000FKopieren, wenn das boolesche Register 1 istif bt: ar = asBedingte Auswahl
movt.sfr, fs, bt11011011 fr fs bt 00000xDB0000 / Maske 0xFF000FGleitkommaregister kopieren, wenn das boolesche Register 1 istif bt: fr = fsGleitkomma (skalar)
msub.sfr, fs, ft01011010 fr fs ft 00000x5A0000 / Maske 0xFF000FMultiplizieren und subtrahierenfr = fr - fs * ftGleitkomma (skalar)
mul.sfr, fs, ft00101010 fr fs ft 00000x2A0000 / Maske 0xFF000FGleitkomma-Multiplikationfr = fs * ftGleitkomma (skalar)
mul16sar, as, at11010001 ar as at 00000xD10000 / Maske 0xFF000FMultiplikation der unteren 16 Bit mit Vorzeichenar = sext(as[15:0]) * sext(at[15:0])Arithmetik
mul16uar, as, at11000001 ar as at 00000xC10000 / Maske 0xFF000FMultiplikation der unteren 16 Bit ohne Vorzeichenar = zext(as[15:0]) * zext(at[15:0])Arithmetik
mullar, as, at10000010 ar as at 00000x820000 / Maske 0xFF000FMultiplikation, die unteren 32 Bitar = (as * at)[31:0]Arithmetik
mulshar, as, at10110010 ar as at 00000xB20000 / Maske 0xFF000FMultiplikation mit Vorzeichen, die oberen 32 Bitar = (as *s at)[63:32]Arithmetik
muluhar, as, at10100010 ar as at 00000xA20000 / Maske 0xFF000FMultiplikation ohne Vorzeichen, die oberen 32 Bitar = (as *u at)[63:32]Arithmetik
negar, at01100000 ar 0000 at 00000x600000 / Maske 0xFF0F0FNegationar = -atArithmetik
neg.sfr, fs11111010 fr fs 011000000xFA0060 / Maske 0xFF00FFGleitkomma-Negationfr = -fsGleitkomma (skalar)
nexp01.sfr, fs11111010 fr fs 101100000xFA00B0 / Maske 0xFF00FFMantisse auf 1..2 bringen und Exponent negieren (Schritt der Division und Wurzel)Gleitkomma (skalar)
nop0000000000100000111100000x0020F0 / Maske 0xFFFFFFKeine Wirkung; wird als nop.n geschriebenSchranken und Sonstiges
nop.n11110000001111010xF03D / Maske 0xFFFFKeine Wirkung (16 Bit)16-Bit-Befehle (Code Density)
nsaat, as010000001110 as at 00000x40E000 / Maske 0xFFF00FAnzahl der Vorzeichenbits minus 1 (Normalisieren mit Vorzeichen)at = count of the leading bits equal to as[31], less 1Logik und Bits
nsauat, as010000001111 as at 00000x40F000 / Maske 0xFFF00FAnzahl der führenden Nullbits (32 bei 0)at = clz(as)Logik und Bits
oeq.sbr, fs, ft00101011 br fs ft 00000x2B0000 / Maske 0xFF000FVergleich: 1, wenn gleich (ohne NaN)br = fs == ftGleitkomma (skalar)
ole.sbr, fs, ft01101011 br fs ft 00000x6B0000 / Maske 0xFF000FVergleich: 1, wenn kleiner oder gleich (ohne NaN)br = fs <= ftGleitkomma (skalar)
olt.sbr, fs, ft01001011 br fs ft 00000x4B0000 / Maske 0xFF000FVergleich: 1, wenn kleiner (ohne NaN)br = fs < ftGleitkomma (skalar)
orar, as, atauch: mov00100000 ar as at 00000x200000 / Maske 0xFF000FODER; mit zwei gleichen Quellen das Kopieren eines Registers (mov, als mov.n)ar = as | atLogik und Bits
orbbr, bs, bt00100010 br bs bt 00000x220000 / Maske 0xFF000FODER boolescher Registerbr = bs | btBoolesche Register
orbcbr, bs, bt00110010 br bs bt 00000x320000 / Maske 0xFF000FODER mit dem Gegenteil des zweitenbr = bs | ~btBoolesche Register
pdtlbat, as010100001101 as at 00000x50D000 / Maske 0xFFF00FDaten-TLB für eine Adresse befragenat = probe DTLB(as)System und Privilegien
pitlbat, as010100000101 as at 00000x505000 / Maske 0xFFF00FBefehls-TLB für eine Adresse befragenat = probe ITLB(as)System und Privilegien
quosar, as, at11010010 ar as at 00000xD20000 / Maske 0xFF000FDivision mit Vorzeichenar = as /s atArithmetik
quouar, as, at11000010 ar as at 00000xC20000 / Maske 0xFF000FDivision ohne Vorzeichen (bei 0: Ausnahme)ar = as /u atArithmetik
rdtlb0at, as010100001011 as at 00000x50B000 / Maske 0xFFF00FEintrag des Daten-TLB lesen (virtuelle Adresse)at = DTLB[as].vaddrSystem und Privilegien
rdtlb1at, as010100001111 as at 00000x50F000 / Maske 0xFFF00FEintrag des Daten-TLB lesen (Übersetzung)at = DTLB[as].paddrSystem und Privilegien
recip0.sfr, fs11111010 fr fs 100000000xFA0080 / Maske 0xFF00FFAnfangswert für einen KehrwertGleitkomma (skalar)
remsar, as, at11110010 ar as at 00000xF20000 / Maske 0xFF000FRest der Division mit Vorzeichenar = as %s atArithmetik
remuar, as, at11100010 ar as at 00000xE20000 / Maske 0xFF000FRest der Division ohne Vorzeichenar = as %u atArithmetik
rerat, as010000000110 as at 00000x406000 / Maske 0xFFF00FExternes Register lesenat = ER[as]System und Privilegien
ret000000000000 s 100000000x000080 / Maske 0xFFF0FFRücksprung nach call0 (an a0); wird als ret.n geschriebenpc = a0Sprünge und Aufrufe
ret.n1111 s 000011010xF00D / Maske 0xF0FFRücksprung nach call0 (16 Bit)pc = a016-Bit-Befehle (Code Density)
retw000000000000 s 100100000x000090 / Maske 0xFFF0FFRücksprung aus einer Funktion mit Registerfenster: dreht das Fenster zurück; wird als retw.n geschriebenpc = a0 (top bits from pc); WINDOWBASE -= a0[31:30]Registerfenster (call4/8/12, entry, retw)
retw.n1111 s 000111010xF01D / Maske 0xF0FFRücksprung mit Registerfenster (16 Bit)pc = a0; WINDOWBASE -= a0[31:30]16-Bit-Befehle (Code Density)
rfdd111100011110 s 000100000xF1E010 / Maske 0xFFF0FFRückkehr aus einer Debug-Ausnahme im Debug-ModusSystem und Privilegien
rfde0000000000110010000000000x003200 / Maske 0xFFFFFFRückkehr aus einer doppelten Ausnahmepc = DEPCSystem und Privilegien
rfdoimm4111100011110 imm4 000000000xF1E000 / Maske 0xFFF0FFRückkehr aus dem Debug-Modus (OCD: der Debugger lässt den Kern weiterlaufen)pc = EPC6; PS = EPS6System und Privilegien
rfe0000000000110000000000000x003000 / Maske 0xFFFFFFRückkehr aus einer Ausnahme der Ebene 1pc = EPC1; PS.EXCM = 0System und Privilegien
rfiimm4000000000011 imm4 000100000x003010 / Maske 0xFFF0FFRückkehr aus einem Interrupt der Ebene imm4pc = EPC[imm4]; PS = EPS[imm4]System und Privilegien
rfrar, fs11111010 ar fs 010000000xFA0040 / Maske 0xFF00FFGleitkommaregister in ein Adressregister kopieren (die Bits)ar = bits(fs)Gleitkomma (skalar)
rfwo0000000000110100000000000x003400 / Maske 0xFFFFFFRückkehr aus dem Handler eines FensterüberlaufsRegisterfenster (call4/8/12, entry, retw)
rfwu0000000000110101000000000x003500 / Maske 0xFFFFFFRückkehr aus dem Handler eines FensterunterlaufsRegisterfenster (call4/8/12, entry, retw)
ritlb0at, as010100000011 as at 00000x503000 / Maske 0xFFF00FEintrag des Befehls-TLB lesen (virtuelle Adresse)at = ITLB[as].vaddrSystem und Privilegien
ritlb1at, as010100000111 as at 00000x507000 / Maske 0xFFF00FEintrag des Befehls-TLB lesen (Übersetzung)at = ITLB[as].paddrSystem und Privilegien
rotwimm40100000010000000 imm4 00000x408000 / Maske 0xFFFF0FDas Registerfenster drehen (in den Handlern der Fensterausnahmen)WINDOWBASE += imm4Registerfenster (call4/8/12, entry, retw)
round.sar, fs, imm410001010 ar fs imm4 00000x8A0000 / Maske 0xFF000FIn eine Ganzzahl wandeln, gerundet (mal 2^imm4)ar = round(fs * 2^imm4)Gleitkomma (skalar)
rsilat, imm4000000000110 imm4 at 00000x006000 / Maske 0xFFF00FPS lesen und die Interrupt-Ebene setzen (Interrupts bis imm4 aus)at = PS; PS.INTLEVEL = imm4System und Privilegien
rsqrt0.sfr, fs11111010 fr fs 101000000xFA00A0 / Maske 0xFF00FFAnfangswert für den Kehrwert einer QuadratwurzelGleitkomma (skalar)
rsrsr, at00000011 sr at 00000x030000 / Maske 0xFF000FSpezialregister lesen; auch rsr.name at geschrieben (rsr.ps a3)at = SR[sr]Spezial- und Benutzerregister
rsync0000000000100000000100000x002010 / Maske 0xFFFFFFWarten, bis geschriebene Spezialregister für das Lesen von Registern geltenSchranken und Sonstiges
rurar, ur11100011 ar ur 00000xE30000 / Maske 0xFF000FBenutzerregister lesen (threadptr, fcr, fsr ...); auch rur.name arar = UR[ur]Spezial- und Benutzerregister
s16iat, as, offsetimm8 0101 as at 00100x005002 / Maske 0x00F00FSpeichern eines Halbwortsmem16[as + (imm8 << 1)] = at[15:0]Laden und Speichern
s32c1iat, as, offsetimm8 1110 as at 00100x00E002 / Maske 0x00F00FBedingtes Speichern (Compare and Swap): speichert at, wenn das Wort gleich SCOMPARE1 ist; at bekommt den alten Wertold = mem32[a]; if old == SCOMPARE1: mem32[a] = at; at = oldLaden und Speichern
s32eat, as, offset01001001 imm4 as at 00000x490000 / Maske 0xFF000FSpeichern für die Handler der Fensterausnahmen (Offset -64..-4)mem32[as + ((imm4 << 2) - 64)] = atRegisterfenster (call4/8/12, entry, retw)
s32iat, as, offsetimm8 0110 as at 00100x006002 / Maske 0x00F00FSpeichern eines Worts; mit kleinem Offset wird daraus s32i.nmem32[as + (imm8 << 2)] = atLaden und Speichern
s32i.nat, as, offsetimm4 as at 10010x0009 / Maske 0x000FSpeichern eines Worts, Offset 0..60 (16 Bit)mem32[as + (imm4 << 2)] = at16-Bit-Befehle (Code Density)
s32nbat, as, offset01011001 imm4 as at 00000x590000 / Maske 0xFF000FSpeichern eines Worts am Schreibpuffer vorbei (Offset 0..60)mem32[as + (imm4 << 2)] = atLaden und Speichern
s32riat, as, offsetimm8 1111 as at 00100x00F002 / Maske 0x00F00FSpeichern eines Worts mit Release-Ordnung (frühere Zugriffe zuerst)release; mem32[as + (imm8 << 2)] = atLaden und Speichern
s8iat, as, imm8imm8 0100 as at 00100x004002 / Maske 0x00F00FSpeichern eines Bytesmem8[as + imm8] = at[7:0]Laden und Speichern
saltar, as, at01110010 ar as at 00000x720000 / Maske 0xFF000FVergleich mit Vorzeichen: 1, wenn kleiner (nur ESP32-S3, nicht ESP32)ar = (as <s at) ? 1 : 0Vergleichen und Tauschen
saltuar, as, at01100010 ar as at 00000x620000 / Maske 0xFF000FVergleich ohne Vorzeichen: 1, wenn kleiner (nur ESP32-S3, nicht ESP32)ar = (as <u at) ? 1 : 0Vergleichen und Tauschen
sddr32.pas000000000111 as 111100000x0070F0 / Maske 0xFFF0FFDebug-Modus: DDR speichern und die Adresse um 4 erhöhenmem32[as] = DDR; as += 4System und Privilegien
sextar, as, bits00100011 ar as b-7 00000x230000 / Maske 0xFF000FVorzeichen erweitern ab Bit b (7..22)ar = sext(as[b:0])Arithmetik
simcall0000000001010001000000000x005100 / Maske 0xFFFFFFAufruf eines Simulators (auf dem Chip ohne Wirkung)System und Privilegien
sllar, as10100001 ar as 000000000xA10000 / Maske 0xFF00FFSchieben nach links um 32 minus SAR (SAR mit ssl gesetzt)ar = as << (32 - SAR)Schieben und Rotieren
slliar, as, sa000 sa[4] 0001 ar as sa[3-0] 00000x010000 / Maske 0xEF000FSchieben nach links um eine Konstante (1..31; die Felder halten 32 minus sa)ar = as << saSchieben und Rotieren
sqrt0.sfr, fs11111010 fr fs 100100000xFA0090 / Maske 0xFF00FFAnfangswert für eine QuadratwurzelGleitkomma (skalar)
sraar, at10110001 ar 0000 at 00000xB10000 / Maske 0xFF0F0FSchieben nach rechts mit Vorzeichen um SARar = at >>s SARSchieben und Rotieren
sraiar, at, sa001 sa[4] 0001 ar sa[3-0] at 00000x210000 / Maske 0xEF000FSchieben nach rechts mit Vorzeichen um eine Konstante (0..31)ar = at >>s saSchieben und Rotieren
srcar, as, at10000001 ar as at 00000x810000 / Maske 0xFF000FSchieben nach rechts über zwei Register (64 Bit) um SAR; mit zweimal demselben Register ein Rotierenar = ((as : at) >> SAR)[31:0]Schieben und Rotieren
srlar, at10010001 ar 0000 at 00000x910000 / Maske 0xFF0F0FSchieben nach rechts ohne Vorzeichen um SARar = at >>u SARSchieben und Rotieren
srliar, at, imm401000001 ar imm4 at 00000x410000 / Maske 0xFF000FSchieben nach rechts ohne Vorzeichen um eine Konstante (0..15; mehr mit extui)ar = at >>u imm4Schieben und Rotieren
ssa8bas010000000011 as 000000000x403000 / Maske 0xFFF0FFSAR für das Schieben um ganze Bytes (big endian) setzenSAR = 32 - as[1:0] * 8Schieben und Rotieren
ssa8las010000000010 as 000000000x402000 / Maske 0xFFF0FFSAR für das Schieben um ganze Bytes (little endian) setzenSAR = as[1:0] * 8Schieben und Rotieren
ssaisa010000000100 sa[3-0] 000 sa[4] 00000x404000 / Maske 0xFFF0EFSAR auf eine Konstante setzenSAR = saSchieben und Rotieren
ssift, as, offsetimm8 0100 as ft 00110x004003 / Maske 0x00F00FGleitkommazahl speichernmem32[as + (imm8 << 2)] = ftGleitkomma (skalar)
ssipft, as, offsetimm8 1100 as ft 00110x00C003 / Maske 0x00F00FGleitkommazahl speichern, dann die Adresse erhöhenmem32[as] = ft; as += imm8 << 2Gleitkomma (skalar)
sslas010000000001 as 000000000x401000 / Maske 0xFFF0FFSAR für das Schieben nach links setzenSAR = 32 - as[4:0]Schieben und Rotieren
ssras010000000000 as 000000000x400000 / Maske 0xFFF0FFSAR für das Schieben nach rechts setzen (aus den unteren 5 Bit)SAR = as[4:0]Schieben und Rotieren
ssxfr, as, at01001000 fr as at 00000x480000 / Maske 0xFF000FGleitkommazahl speichern, Adresse aus zwei Registernmem32[as + at] = frGleitkomma (skalar)
ssxpfr, as, at01011000 fr as at 00000x580000 / Maske 0xFF000FGleitkommazahl speichern, dann die Adresse erhöhenmem32[as] = fr; as += atGleitkomma (skalar)
subar, as, at11000000 ar as at 00000xC00000 / Maske 0xFF000FSubtraktion zweier Registerar = as - atArithmetik
sub.sfr, fs, ft00011010 fr fs ft 00000x1A0000 / Maske 0xFF000FGleitkomma-Subtraktionfr = fs - ftGleitkomma (skalar)
subx2ar, as, at11010000 ar as at 00000xD00000 / Maske 0xFF000FSubtraktion, das erste Register mal 2ar = (as << 1) - atArithmetik
subx4ar, as, at11100000 ar as at 00000xE00000 / Maske 0xFF000FSubtraktion, das erste Register mal 4ar = (as << 2) - atArithmetik
subx8ar, as, at11110000 ar as at 00000xF00000 / Maske 0xFF000FSubtraktion, das erste Register mal 8ar = (as << 3) - atArithmetik
syscall0000000001010000000000000x005000 / Maske 0xFFFFFFSystemaufruf: löst die Ausnahme SYSCALL ausSystem und Privilegien
trunc.sar, fs, imm410011010 ar fs imm4 00000x9A0000 / Maske 0xFF000FIn eine Ganzzahl wandeln, abgeschnittenar = trunc(fs * 2^imm4)Gleitkomma (skalar)
ueq.sbr, fs, ft00111011 br fs ft 00000x3B0000 / Maske 0xFF000FVergleich: 1, wenn gleich oder NaNbr = fs == ft or unorderedGleitkomma (skalar)
ufloat.sfr, as, imm411011010 fr as imm4 00000xDA0000 / Maske 0xFF000FGanzzahl ohne Vorzeichen in Gleitkomma wandeln, geteilt durch 2^imm4fr = ufloat(as) / 2^imm4Gleitkomma (skalar)
ule.sbr, fs, ft01111011 br fs ft 00000x7B0000 / Maske 0xFF000FVergleich: 1, wenn kleiner oder gleich oder NaNbr = fs <= ft or unorderedGleitkomma (skalar)
ult.sbr, fs, ft01011011 br fs ft 00000x5B0000 / Maske 0xFF000FVergleich: 1, wenn kleiner oder NaNbr = fs < ft or unorderedGleitkomma (skalar)
un.sbr, fs, ft00011011 br fs ft 00000x1B0000 / Maske 0xFF000FVergleich: 1, wenn eine der Zahlen NaN istbr = isnan(fs) or isnan(ft)Gleitkomma (skalar)
utrunc.sar, fs, imm411101010 ar fs imm4 00000xEA0000 / Maske 0xFF000FIn eine Ganzzahl ohne Vorzeichen wandeln, abgeschnittenar = utrunc(fs * 2^imm4)Gleitkomma (skalar)
waitiimm4000000000111 imm4 000000000x007000 / Maske 0xFFF0FFInterrupt-Ebene setzen und auf einen Interrupt warten (Strom sparen)PS.INTLEVEL = imm4; waitSystem und Privilegien
wdtlbat, as010100001110 as at 00000x50E000 / Maske 0xFFF00FEintrag des Daten-TLB schreibenDTLB[as] = atSystem und Privilegien
werat, as010000000111 as at 00000x407000 / Maske 0xFFF00FExternes Register schreibenER[as] = atSystem und Privilegien
wfrfr, as11111010 fr as 010100000xFA0050 / Maske 0xFF00FFAdressregister in ein Gleitkommaregister kopieren (die Bits)fr = bits(as)Gleitkomma (skalar)
witlbat, as010100000110 as at 00000x506000 / Maske 0xFFF00FEintrag des Befehls-TLB schreibenITLB[as] = atSystem und Privilegien
wsrsr, at00010011 sr at 00000x130000 / Maske 0xFF000FSpezialregister schreiben; auch wsr.name atSR[sr] = atSpezial- und Benutzerregister
wurur, at11110011 ur at 00000xF30000 / Maske 0xFF000FBenutzerregister schreiben; auch wur.name atUR[ur] = atSpezial- und Benutzerregister
xorar, as, at00110000 ar as at 00000x300000 / Maske 0xFF000FExklusives ODERar = as ^ atLogik und Bits
xorbbr, bs, bt01000010 br bs bt 00000x420000 / Maske 0xFF000FExklusives ODER boolescher Registerbr = bs ^ btBoolesche Register
xsrsr, at01100001 sr at 00000x610000 / Maske 0xFF000FSpezialregister und Register tauschen; auch xsr.name att = SR[sr]; SR[sr] = at; at = tSpezial- und Benutzerregister