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

これらの関数はそれぞれ符号付き除算と符号なし除算を実行します。条件フラグには影響しません。