Datové operace
Dostali jsme data do registrů, umíme uložit obsah registrů do paměti, můžeme začít provádět operace nad daty.
Sčítaní a odčítání
Základní datovou operací je sčítání a odčítání. Operace je prováděna nad dvěma registry nebo registrem a přímou hodnotou, výsledek je dosazen do cílového registru. Pro sčítání a odčítání má Cortex-M3 instrukce
- ADD - sečtení dvou operandů a dosazení výsledku do registru.
- ADC - sečtení dvou operandů, přičtení příznaku přenosu Carry a dosazení výsledku do registru
- SUB - odečtení dvou operandů a dosazení výsledku do registru.
- SBC - odečtení dvou operandů, pokud je příznaku přenosu Carry nulový snížení o 1 a dosazení výsledku do registru
K instrukci lze přidat příponu S, která vynutí aktualizaci příznaků N, Z, C a V ve speciálním registru APSR po provedení operace. Pokud je použita Thumb instrukce, jsou příznaky v registru APSR aktualizovány implicitně.
Pokud je v programu použita unifikovaná syntaxe zápisu instrukcí UAL (jsou uvedeny všechny tři operandy) a k instrukci není přidána přípona S, je generována 32-bitová instrukce, která neaktualizuje obsah APSR.
ADD R0, R1, R2 @ R0 = R1 + R2
ADD.W R0, R1, R2 @ R0 = R1 + R2
ADDS.W R0, R1, R2 @ R0 = R1 + R2
ADDS R0, R1, #2156 @ R0 = R1 + 2156
ADD R0, R1 @ R0 = R0 + R1
ADD R0, R1, #28 @ R0 = R1 + 28
ADC R0, R1 @ R0 = R0 + R1 + Carry
ADC R0, #41 @ R0 = R0 + 41 + Carry
SUB R0, R1, R2 @ R0 = R1 - R2
SUB R0, R1, #35 @ R0 = R1 - 35
SUB R0, #21 @ R0 = R0 - 35
SBC R0, R1, R2 @ R0 = R1 - R2 + Carry - 1
SBC R0, R1 @ R0 = R0 - R1 + Carry - 1
Násobení a dělení
Násobení provádí instrukce MUL, dělení instrukce UDIV (bez znaménka) nebo SDIV (se znaménkem).
MUL R0, R1, R2 @ R0 = R1 * R2
MUL R0, R1 @ R0 = R0 * R1
UDIV R0, R1, R2 @ R0 = R1 / R2
SDIV R0, R1, R2 @ R0 = R1 / R2
Výsledek násobení je samozřejmě omezen velikostí 32-bitového registru. Cortex-M3 je vybaven instrukcemi pro násobení se 64-bitovým výsledkem, který je uložen do dvou registrů. Instrukce UMULL provádí násobení bez znaménka, instrukce SMULL násobení se znaménkem.
Logické operace
Logické operace jsou prováděny nad dvěma registry nebo registrem a přímou hodnotou, výsledek je dosazen do cílového registru
- AND - logický součin
- ORR - logický součet
- EOR - exkluzivní disjunkce (Exclusive OR)
- BIC - nulování bitů
- ORN - nastavení bitů
AND R0, R1, R2 @ R0 = R1 AND R2
AND R0, R1 @ R0 = R0 AND R1
AND R0, R1, #4 @ R0 = R1 AND 1
ORR R0, R1, R2 @ R0 = R1 OR R2
EOR R0, R1, R2 @ R0 = R1 XOR R2
BIC R0, R1, R2 @ R0 = R1 AND NOT R2
ORN R0, R1, R2 @ R0 = R1 OR NOT R2
Posuny a rotace
Operace posunů a rotací provádí posun druhého operandu vlevo nebo vpravo. Třetí operand definuje, kolikrát se operace posuvu provede. Výsledek je dosazen do prvního operandu. Třetí operand může být registr nebo přímá hodnota.
- ASR - aritmetický posun vpravo. Všechny bity jsou posunuty vpravo, obsah nejvyššího bitu zůstane nezměněn.
- LSL - logický posun vlevo. Všechny bity se posunou vlevo, nejnižší bit je vynulován.
- LSR - logický posun vpravo. Všechny bity se posunou vpravo, nejvyšší bit je vynulován.
- ROR - rotace vpravo. Všechny bity se posunou vpravo, nejnižší bit je zapsán do nejvyššího bitu.
- RRX - rotace vpravo rozšířená o Carry. Tato instrukce nemá třetí operand, rotace vpravo se provede pouze o jeden bit.
ASR R0, R1, R2 @ R0 = R1 >> R2
ASR R0, R1, #3 @ R0 = R1 >> 3
LSL R0, R1, R2 @ R0 = R1 << R2
LSL R0, R1, #5 @ R0 = R1 << 5
RRX R0, R1 @ R0 = rotace R1 a Carry
