5. Arithmetische Befehle

5.1. Dokumentkonventionen

Notation: Rd, Rm, Rn bezeichnen die ARM-Register R0-R7. immN bezeichnet einen unmittelbaren Wert mit einer Breite von N Bits, z. B. imm8, imm3. carry bezeichnet das Übertrags-Bedingungsflag, not(carry) bezeichnet dessen Komplement. Bei Befehlen mit mehr als einem Registerargument ist es zulässig, dass einige identisch sind. Folgendes addiert beispielsweise den Inhalt von R0 zu sich selbst und legt das Ergebnis in R0 ab:

  • add(r0, r0, r0)

Arithmetische Befehle beeinflussen die Bedingungsflags, sofern nicht anders angegeben.

5.2. Addition

  • 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. Subtraktion

  • 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. Negation

  • neg(Rd, Rn) Rd = -Rn

5.5. Multiplikation und Division

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

Dies erzeugt ein 32-Bit-Ergebnis, wobei ein Überlauf verloren geht. Das Ergebnis kann je nach Definition der Operanden als vorzeichenbehaftet oder vorzeichenlos behandelt werden.

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

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

Diese Funktionen führen eine vorzeichenbehaftete bzw. eine vorzeichenlose Division durch. Die Bedingungsflags werden nicht beeinflusst.