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

這兩個函式分別執行有號與無號除法。條件旗標不受影響。