ADD、SUB、RSB、ADC、SBC、RSC

キャリー付きまたはキャリーなしの加算、減算、および逆減算です。

Show/hide構文

op{S}{cond} {Rd}, Rn, Operand2
op{cond} {Rd}, Rn, #imm12               ; Thumb-2 ADD および SUB のみ

各パラメータには以下の意味があります。

op

次のいずれかを指定します。

ADD

加算

ADC

キャリー付き加算

SUB

減算

RSB

逆減算

SBC

キャリー付き減算

RSC

キャリー付き逆減算(ARM のみ)

S

任意に指定できる接尾文字です。S が指定されている場合は、演算結果に基づいて条件コードフラグが更新されます。

cond

任意の条件コードを指定します。

Rd

デスティネーションレジスタを指定します。

Rn

第 1 オペランドを保持するレジスタを指定します。

Operand2

フレキシブル第 2 オペランドを指定します。

imm12

0 ~ 4095 の範囲の値を指定します。

Show/hide使用法

ADD 命令は、RnOperand2 または imm12 の値を加算します。

SUB 命令は、Operand2 または imm12 の値を Rn の値から減算します。

RSB(逆減算)命令は、Operand2 の値から Rn の値を減算します。Operand2 にはさまざまなオプションがあるので、この命令は便利です。

ADCSBC、および RSC を使用して、マルチワード算術演算を構成できます。

ADC(キャリー付き加算)命令は、Rn の値と Operand2 の値、そしてキャリーフラグも含めて加算します。

SBC(キャリー付き減算)命令は、Rn の値から Operand2 の値を減算します。キャリーフラグがクリアされている場合は、結果から 1 が引かれます。

RSC(キャリー付き逆減算)命令は、Operand2 の値から Rn の値を減算します。キャリーフラグがクリアされている場合は、結果から 1 が引かれます。

状況によっては、ある命令をアセンブラによって別の命令に置換できる場合があります。逆アセンブルリストを参照するときは、この点に注意し下さい。

Show/hideThumb 命令での PC および SP の使用

これらの命令のほとんどでは、Rd、またはオペランドに PC(R15)は使用できません。

例外は以下のとおりです。 

  • 32 ビット Thumb ADD 命令および SUB 命令で、定数 Operand2 の値が 0 ~ 4095 の範囲にあり、接尾文字 S が指定されていない場合は、Rn に PC を使用できます。これらの命令は PC 相対アドレスを生成するのに役立ちます。このとき、PC のビット [1] の値が 0 として読み出されるので計算に使用するベースアドレスが常にワード境界で整列されます。

  • 両方のレジスタで PC を使用できない場合、16 ビット Thumb ADD{cond} Rd, Rd, Rm 命令で PC を使用できます。ただし、次の 16 ビット Thumb 命令は、ARMv6T2 以降では非推奨です。

    • ADD{cond} PC, SP, PC

    • ADD{cond} SP, SP, PC

これらの命令のほとんどでは、Rd、またはオペランドに SP(R13)は使用できません。ただし、次の場合を除きます。

  • ADD および SUB 命令では、Rn に SP を使用できます。

  • ADD{cond} SP, SP, SP は使用できますが、ARMv6T2 以降では非推奨です。

  • shift が省略されるか、LSL #1LSL #2、または LSL #3 の場合、ADD{S}{cond} SP, SP, Rm{,shift} および SUB{S}{cond} SP, SP, Rm{,shift} が使用できます。

Show/hideARM 命令での PC および SP の使用

レジスタ制御シフトを行うデータ処理命令の場合は、Rd やオペランドに PC は使用できません。

ADD および SUB を除き、レジスタ制御シフトを行わない命令のオペランドでの PC の使用は非推奨です。

レジスタ制御シフトを行わない SUB 命令では、PC の使用は以下の場合を除き、非推奨です。

  • Rd での PC の使用

  • 命令 SUB{cond} Rd, Rn, #ConstantRn での PC の使用

レジスタ制御シフトを行わない ADD 命令では、PC の使用は以下の場合を除き、非推奨です。

  • SP をレジスタに追加しない命令の Rd での PC の使用

  • SP 以外の 2 つのレジスタを追加する命令の Rn での PC の使用と、Rm での PC の使用

  • 命令 ADD{cond} Rd, Rn, #ConstantRn での PC の使用

Rn または Rm に PC(R15)を指定している場合、使用される値は「命令のアドレス + 8」となります。

Rd に PC を指定した場合、以下のようになります。

  • 演算結果に対応するアドレスへの分岐が実行されます。

  • S 接尾文字を使用する場合は、SUBS pc,lr 命令を参照して下さい。

Rn での SP は ADD および SUB 命令で使用できますが、ADDS PC, SP, #Constant および SUBS PC, SP, #Constant は非推奨です。

ADD(レジスタ)および SUB(レジスタ)での SP は、Rn が SP で shift が省略されている場合、または LSL #1LSL #2、LSL #3 のいずれかの場合に使用できます。

これらの ARM 命令では、他の SP の使用は非推奨です。

Note

ARM 命令での SP と PC の非推奨は、ARMv6T2 以降のみです。

Show/hide条件フラグ

S が指定されている場合、これらの命令は演算結果に基づいて N、Z、C、および V の各フラグを更新します。

Show/hide16 ビット命令

これらの命令は、Thumb コード内では次の形式で使用できます。これらは 16 ビット命令です。

ADDS Rd, Rn, #imm

imm の範囲は 0 ~ 7 です。RdRn は共に Lo レジスタである必要があります。

ADDS Rd, Rn, Rm

RdRn、および Rm はいずれも Lo レジスタである必要があります。

ADD Rd, Rd, Rm

ARMv6 以前:Rd または Rm の少なくとも一方が Hi レジスタである必要があります。ARMv6T2 以降:この制約は適用されません。

ADDS Rd, Rd, #imm

imm の範囲は 0 ~ 255 です。Rd は Lo レジスタである必要があります。

ADCS Rd, Rd, Rm

RdRn、および Rm はいずれも Lo レジスタである必要があります。

ADD SP, SP, #imm

imm の範囲は 0 ~ 508 です(ワード境界で整列します)。

ADD Rd, SP, #imm

imm の範囲は 0 ~ 1020 です(ワード境界で整列します)。Rd は Lo レジスタである必要があります。

ADD Rd, pc, #imm

imm の範囲は 0 ~ 1020 です(ワード境界で整列します)。Rd は Lo レジスタである必要があります。この命令では、PC のビット [1:0] を 0 として読み出します。

SUBS Rd, Rn, Rm

RdRn、および Rm はいずれも Lo レジスタである必要があります。

SUBS Rd, Rn, #imm

imm の範囲は 0 ~ 7 です。RdRn は共に Lo レジスタである必要があります。

SUBS Rd, Rd, #imm

imm の範囲は 0 ~ 255 です。Rd は Lo レジスタである必要があります。

SBCS Rd, Rd, Rm

RdRn、および Rm はいずれも Lo レジスタである必要があります。

SUB SP, SP, #imm

imm の範囲は 0 ~ 508 です(ワード境界で整列します)。

RSBS Rd, Rn, #0

RdRn は共に Lo レジスタである必要があります。

Show/hide

    ADD     r2, r1, r3
    SUBS    r8, r6, #240        ; 結果にフラグを設定する
    RSB     r4, r4, #1280       ; 1280 から R4 の内容を減算する
    ADCHI   r11, r0, r3         ; C フラグが設定され、Z
                                ; フラグがクリアされた場合にのみ実行される
    RSCSLE  r0,r5,r0,LSL r4     ; 条件付き、フラグ設定

Show/hide誤用例

    RSCSLE  r0,pc,r0,LSL r4    ; PC とレジスタ制御シフトは
                                ; 一緒に指定できない

Show/hideマルチワード演算の例

以下の 2 つの命令は、R2R3 に保持される 1 つの 64 ビット整数を、R0R1 に保持される別の 64 ビット整数に加算し、その結果を R4R5 に返します。

    ADDS    r4, r0, r2    ; 最下位ワードを加算する
    ADC     r5, r1, r3    ; 最上位ワードを加算する

以下の命令は、一方の 96 ビット整数を他方の値から減算します。

    SUBS    r3, r6, r9
    SBCS    r4, r7, r10
    SBC     r5, r8, r11

上記の例では分かりやすくするために、マルチワードの値に使用するレジスタを連続させていますが、必ずしもそうする必要はありません。例えば、以下のようにすることもできます。

    SUBS    r6, r6, r9
    SBCS    r9, r2, r1
    SBC     r2, r8, r11

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0489EJ
Non-ConfidentialID081711