5. Rekenkundige instructies

5.1. Documentconventies

Notatie: Rd, Rm, Rn duiden ARM-registers R0-R7 aan. immN duidt een directe waarde aan met een breedte van N bits, bijv. imm8, imm3. carry duidt de carry-conditievlag aan, not(carry) duidt het complement ervan aan. In het geval van instructies met meer dan één registerargument is het toegestaan dat sommige identiek zijn. Het volgende telt bijvoorbeeld de inhoud van R0 bij zichzelf op en plaatst het resultaat in R0:

  • add(r0, r0, r0)

Rekenkundige instructies beïnvloeden de conditievlaggen, behalve waar anders vermeld.

5.2. Optelling

  • add(Rdn, imm8) Rdn = Rdn + imm8

  • add(Rd, Rn, imm3) Rd = Rn + imm3

  • add(Rd, Rn, Rm) Rd = Rn + Rm

  • adc(Rd, Rn) Rd = Rd + Rn + carry

5.3. Aftrekking

  • sub(Rdn, imm8) Rdn = Rdn - imm8

  • sub(Rd, Rn, imm3) Rd = Rn - imm3

  • sub(Rd, Rn, Rm) Rd = Rn - Rm

  • sbc(Rd, Rn) Rd = Rd - Rn - not(carry)

5.4. Negatie

  • neg(Rd, Rn) Rd = -Rn

5.5. Vermenigvuldiging en deling

  • mul(Rd, Rn) Rd = Rd * Rn

Dit produceert een 32-bits resultaat waarbij overflow verloren gaat. Het resultaat kan als signed of unsigned worden behandeld, afhankelijk van de definitie van de operanden.

  • sdiv(Rd, Rn, Rm) Rd = Rn / Rm

  • udiv(Rd, Rn, Rm) Rd = Rn / Rm

Deze functies voeren respectievelijk signed en unsigned deling uit. De conditievlaggen worden niet beïnvloed.