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

Эти функции выполняют знаковое и беззнаковое деление соответственно. Флаги условий не затрагиваются.