Produkty Novinky Články Návody Kontakty

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
​