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