5. Instruções aritméticas

5.1. Convenções do documento

Notação: Rd, Rm, Rn denotam os registradores ARM R0-R7. immN denota um valor imediato com largura de N bits, por exemplo imm8, imm3. carry denota a flag de condição de carry, not(carry) denota seu complemento. No caso de instruções com mais de um argumento de registrador, é permitido que alguns sejam idênticos. Por exemplo, o seguinte somará o conteúdo de R0 a ele mesmo, colocando o resultado em R0:

  • add(r0, r0, r0)

As instruções aritméticas afetam as flags de condição, exceto onde indicado.

5.2. Adição

  • 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. Subtração

  • 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. Negação

  • neg(Rd, Rn) Rd = -Rn

5.5. Multiplicação e divisão

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

Isto produz um resultado de 32 bits com perda de overflow. O resultado pode ser tratado como com sinal ou sem sinal, conforme a definição dos operandos.

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

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

Estas funções realizam divisão com sinal e sem sinal, respectivamente. As flags de condição não são afetadas.