5. Instruções aritméticas¶
5.1. Convenções do documento¶
Notação: Rd, Rm, Rn denotam registos ARM R0-R7. immN denota um valor imediato com uma largura de N bits, por exemplo imm8, imm3. carry denota o sinalizador de condição de transporte, not(carry) denota o seu complemento. No caso de instruções com mais de um argumento de registo, é permitido que alguns sejam idênticos. Por exemplo, o seguinte adicionará o conteúdo de R0 a si próprio, colocando o resultado em R0:
add(r0, r0, r0)
As instruções aritméticas afetam os sinalizadores de condição, exceto onde indicado.
5.2. Adição¶
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. Subtração¶
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. 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 o overflow descartado. O resultado pode ser tratado como com ou sem sinal, de acordo com a definição dos operandos.
sdiv(Rd, Rn, Rm)
Rd = Rn / Rmudiv(Rd, Rn, Rm)
Rd = Rn / Rm
Estas funções realizam divisão com e sem sinal, respetivamente. Os sinalizadores de condição não são afetados.