5. Instrukcje arytmetyczne

5.1. Konwencje dokumentu

Notacja: Rd, Rm, Rn oznaczają rejestry ARM R0-R7. immN oznacza wartość natychmiastową o szerokości N bitów, np. imm8, imm3. carry oznacza flagę warunku przeniesienia, not(carry) oznacza jej dopełnienie. W przypadku instrukcji z więcej niż jednym argumentem rejestrowym dopuszczalne jest, aby niektóre z nich były identyczne. Na przykład poniższa instrukcja doda zawartość R0 do siebie samej, umieszczając wynik w R0:

  • add(r0, r0, r0)

Instrukcje arytmetyczne wpływają na flagi warunku, o ile nie zaznaczono inaczej.

5.2. Dodawanie

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

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

  • neg(Rd, Rn) Rd = -Rn

5.5. Mnożenie i dzielenie

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

Daje to wynik 32-bitowy z utratą nadmiaru. Wynik może być traktowany jako liczba ze znakiem lub bez znaku, zgodnie z definicją operandów.

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

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

Funkcje te wykonują odpowiednio dzielenie ze znakiem i bez znaku. Flagi warunku nie są naruszane.