5. Арифметичні інструкції

5.1. Угоди щодо документації

Позначення: Rd, Rm, Rn означають ARM-регістри R0-R7. immN означає безпосереднє значення шириною N біт, наприклад imm8, imm3. carry означає прапорець умови перенесення, not(carry) означає його доповнення. Для інструкцій з кількома аргументами-регістрами допустимо, щоб деякі з них були однаковими. Наприклад, наступне додасть вміст R0 до себе, помістивши результат у R0:

  • add(r0, r0, r0)

Арифметичні інструкції впливають на прапорці умов, якщо не зазначено інше.

5.2. Додавання

  • 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. Віднімання

  • 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. Заперечення

  • neg(Rd, Rn) Rd = -Rn

5.5. Множення та ділення

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

Це дає 32-бітний результат із втратою переповнення. Результат може розглядатися як зі знаком або без знаку відповідно до визначення операндів.

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

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

Ці функції виконують ділення зі знаком та без знаку відповідно. Прапорці умов не змінюються.