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 + imm8add(Rd, Rn, imm3)
Rd = Rn + imm3add(Rd, Rn, Rm)
Rd = Rn + Rmadc(Rd, Rn)
Rd = Rd + Rn + carry
5.3. Вычитание¶
sub(Rdn, imm8)
Rdn = Rdn - imm8sub(Rd, Rn, imm3)
Rd = Rn - imm3sub(Rd, Rn, Rm)
Rd = Rn - Rmsbc(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 / Rmudiv(Rd, Rn, Rm)
Rd = Rn / Rm
Эти функции выполняют знаковое и беззнаковое деление соответственно. Флаги условий не затрагиваются.