5. Istruzioni aritmetiche

5.1. Convenzioni del documento

Notazione: Rd, Rm, Rn indicano i registri ARM R0-R7. immN indica un valore immediato avente una larghezza di N bit, ad esempio imm8, imm3. carry indica il flag di condizione di riporto, not(carry) ne indica il complemento. Nel caso di istruzioni con più di un argomento registro, è ammesso che alcuni siano identici. Ad esempio, quanto segue sommerà il contenuto di R0 a se stesso, ponendo il risultato in R0:

  • add(r0, r0, r0)

Le istruzioni aritmetiche influenzano i flag di condizione, tranne dove indicato.

5.2. Addizione

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

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

  • neg(Rd, Rn) Rd = -Rn

5.5. Moltiplicazione e divisione

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

Questo produce un risultato a 32 bit con perdita dell’overflow. Il risultato può essere trattato come con segno o senza segno a seconda della definizione degli operandi.

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

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

Queste funzioni eseguono rispettivamente la divisione con segno e senza segno. I flag di condizione non vengono influenzati.