5. 算术指令

5.1. 文档约定

记法:Rd, Rm, Rn 表示 ARM 寄存器 R0-R7。immN 表示宽度为 N 位的立即数,例如 imm8imm3carry 表示进位条件标志,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

这些函数分别执行有符号除法和无符号除法。条件标志不受影响。