Befehlssatz des RP2040

Aus Micropython Referenz
Zur Navigation springen Zur Suche springen

Hier habe ich den Befehlssatz des Pico, so wie er in dessen Datenblatt aufgeführt ist eingetragen.
Es zeigte sich jedoch, dass der Micropython Inline Assembler diesen Befehlssatz nur eingeschränkt unterstützt.
Die im Datenblatt aufgeführten Befehle, die nicht unterstützt werden habe ich durchgestrichen.
Die meist einfacheren Befehle, die stattdessen funktionieren und nicht im Datenblatt aufgeführt sind habe ich grün dargestellt.

Suffixe[Bearbeiten | Quelltext bearbeiten]

S
Befehl updated das Statueregister (APRS)

Wertgrößen[Bearbeiten | Quelltext bearbeiten]

B
Es wird ein Byte (8-bit) bearbeitet.
H
Es wird ein Halbword (16-bit) bearbeitet.
W
Es wird ein Word (32-bit) bearbeitet.
Ist optional.

Statusflags[Bearbeiten | Quelltext bearbeiten]

EQ
NE
CS
CC
MI
PL
VS
VC
HI
LS
GE
LT
GT
LE


Die Zahl hinter der Beschreibung entspricht der Anzahl der Takte die dieser Befehl dauert.

Move[Bearbeiten | Quelltext bearbeiten]

Daten zwischen Registern verschieben.

MOVS Rd, #<imm>
8-bit immediate 1
MOVS Rd, Rm
Lo to Lo 1

MOV Rd, Rm
Any to Any 1
MOV PC, Rm
Any to PC 2
MOV Rd, #<imm>
8-bit immediate 1

Add[Bearbeiten | Quelltext bearbeiten]

2 Register addieren

ADDS Rd, Rn, #<imm>
3-bit immediate 1
ADDS Rd, Rn, Rm
All registers Lo 1
ADD Rd, Rd, Rm
Any to Any 1
ADD PC, PC, Rm
Any to PC 2
ADDS Rd, Rd, #<imm>
8-bit immediate 1
ADCS Rd, Rd, Rm
With carry 1
ADD SP, SP, #<imm>
Immediate to SP 1
ADD Rd, SP, #<imm>
Form address from SP 1
ADR Rd, <label>
Form address from PC 1

Subtract[Bearbeiten | Quelltext bearbeiten]

Register von einander abziehen.

SUBS Rd, Rn, Rm
Lo and Lo 1
SUBS Rd, Rn, #<imm>
3-bit immediate 1
SUBS Rd, Rd, #<imm>
8-bit immediate 1
SBCS Rd, Rd, Rm
With carry 1
SUB SP, SP, #<imm>
Immediate from SP 1
RSBS Rd, Rn, #0
Negate 1

Multiply[Bearbeiten | Quelltext bearbeiten]

MULS Rd, Rm, Rd
Multiply 1

Compare[Bearbeiten | Quelltext bearbeiten]

Register vergleichen.

CMP Rn, Rm
Compare 1
CMN Rn, Rm
Negative 1
CMP Rn, #<imm>
Immediate 1

Logical[Bearbeiten | Quelltext bearbeiten]

Register logisch Bitweise Verknüpfen.

ANDS Rd, Rd, Rm
AND 1
EORS Rd, Rd, Rm
Exclusive OR 1
ORRS Rd, Rd, Rm
OR 1
BICS Rd, Rd, Rm
Bit clear 1
MVNS Rd, Rm
Move NOT 1
TST Rn, Rm
AND test 1

Shift[Bearbeiten | Quelltext bearbeiten]

LSL Rd, Rm
Rd << Rm
LSR Rd, Rm
Rd >> Rm
ASR Rd, Rm
Rd >> Rm

LSL mit festen Werten und LSLS mit 3 Argumenten wird nicht unterstützt!

LSLS Rd, Rm, #<shift>
Logical shift left by immediate 1
LSLS Rd, Rd, Rs
Logical shift left by register 1
LSRS Rd, Rm, #<shift>
Logical shift right by immediate 1
LSRS Rd, Rd, Rs
Logical shift right by register 1
ASRS Rd, Rm, #<shift>
Arithmetic shift right 1
ASRS Rd, Rd, Rs
Arithmetic shift right by register 1

Rotate[Bearbeiten | Quelltext bearbeiten]

ROR Rd, Rs
rechts rotieren

RORS Rd, Rd, Rs
Rotate right by register 1

Load[Bearbeiten | Quelltext bearbeiten]

LDR Rd, [Rn, #<imm>]
Word, immediate offset 2 or 1a
LDRH Rd, [Rn, #<imm>]
Halfword, immediate offset 2 or 1a
LDRB Rd, [Rn, #<imm>]
Byte, immediate offset 2 or 1a
LDR Rd, [Rn, Rm]
Word, register offset 2 or 1a
LDRH Rd, [Rn, Rm]
Halfword, register offset 2 or 1a
LDRSH Rd, [Rn, Rm]
Signed halfword, register offset 2 or 1a
LDRB Rd, [Rn, Rm]
Byte, register offset 2 or 1a
LDRSB Rd, [Rn, Rm]
Signed byte, register offset 2 or 1a
LDR Rd, <label>
PC-relative 2 or 1a
LDR Rd, [SP, #<imm>]
SP-relative 2 or 1a
LDM Rn!, {<loreglist>}
Multiple, excluding base 1+Nb
LDM Rn, {<loreglist>}
Multiple, including base 1+Nb

Store[Bearbeiten | Quelltext bearbeiten]

STR Rd, [Rn, #<imm>]
Word, immediate offset 2 or 1a
STRH Rd, [Rn, #<imm>]
Halfword, immediate offset 2 or 1a
STRB Rd, [Rn, #<imm>]
Byte, immediate offset 2 or 1a
STR Rd, [Rn, Rm]
Word, register offset 2 or 1
STRH Rd, [Rn, Rm]
Halfword, register offset 2 or 1a
STRB Rd, [Rn, Rm]
Byte, register offset 2 or 1a
STR Rd, [SP, #<imm>]
SP-relative 2 or 1a
STM Rn!, {<loreglist>}
Multiple 1+Nb

Push[Bearbeiten | Quelltext bearbeiten]

Register auf den Stack schieben. Es kann eine Liste von Registern, durch Komma getrennt angegeben werden.
Funktioniert nur mit den Low-Registern (r0-r7)

PUSH {<loreglist>}
Push 1+Nb - nur r0 ... r7
PUSH {<loreglist>, LR}
Push with link register 1+Nc

Pop[Bearbeiten | Quelltext bearbeiten]

Werte vom Stack in Register laden.

POP {<loreglist>}
Pop 1+Nb
POP {<loreglist>, PC}
Pop and return 3+Nc

Branch[Bearbeiten | Quelltext bearbeiten]

B<cc> <label>
Conditional 1 or 2d
B <label>
Unconditional 2
BL <label>
With link 3
BX Rm
With exchange 2
BLX Rm
With link and exchange 2

Extend[Bearbeiten | Quelltext bearbeiten]

SXTH Rd, Rm
Signed halfword to word 1
SXTB Rd, Rm
Signed byte to word 1
UXTH Rd, Rm
Unsigned halfword 1
UXTB Rd, Rm
Unsigned byte 1

Reverse[Bearbeiten | Quelltext bearbeiten]

REV Rd, Rm
Bytes in word 1
REV16 Rd, Rm
Bytes in both halfwords 1
REVSH Rd, Rm
Signed bottom half word 1

State[Bearbeiten | Quelltext bearbeiten]

SVC #<imm>
change Supervisor Call - e
CPSID i
Disable interrupts 1
CPSIE i
Enable interrupts 1

MRS Rd, <specreg>
Read special register 3
MSR <specreg>, Rn
Write special register 3

BKPT #<imm>
Breakpoint - e

Hint[Bearbeiten | Quelltext bearbeiten]

SEV
Send-Event 1
WFE
Wait For Event 2f
WFI
Wait For Interrupt 2f
YIELD
Yield 1f
NOP
No operation 1

Barriers[Bearbeiten | Quelltext bearbeiten]

ISB
Instruction synchronization 3
DMB
Data memory 3
DSB
Data synchronization 3

Table Notes[Bearbeiten | Quelltext bearbeiten]

a
2 if to AHB interface or SCS, 1 if to single-cycle I/O port.
b
N is the number of elements in the list.
c
N is the number of elements in the list including PC or LR.
d
2 if taken, 1 if not-taken.
e
Cycle count depends on processor and debug configuration.
f
Excludes time spent waiting for an interrupt or event.
g
Executes as NOP