SBC 命令 (Subtract Memory from Accumulator with Carry)
オペランドに指定された値をアキュムレータから減算し、結果をアキュムレータに返します。

SBCオーバーロード
オペコード 構文 アドレッシングモード バイト数 命令サイクル
E9
SBC #const
Imm.
2/ 3
2
1, 4
E5
SBC dp
DP.
2
3
1, 2
F2
SBC (dp)
DP. Ind
2
5
1, 2
E7
SBC [dp]
DP. Ind long
2
6
1, 2
F5
SBC dp, X
DP. Idx X
2
4
1, 2
E1
SBC (dp, X)
DP. Idx Ind X
2
6
1, 2
F1
SBC (dp), Y
DP. Ind Idx Y
2
5
1, 2, 3
F7
SBC [dp], Y
DP. Ind long Idx Y
2
6
1, 2
ED
SBC abs
Abs.
3
4
1
FD
SBC abs, X
Abs. Idx X
3
4
1, 3
F9
SBC abs, Y
Abs. Idx Y
3
4
1, 3
EF
SBC long
Abs. Iong
4
5
1
FF
SBC long, X
Abs. long Idx X
4
5
1
E3
SBC sp, S
SR.
2
4
1
F3
SBC (sp, S), Y
SR. Ind Idx Y
2
7
1


1. メモリモードフラグクリア時は1サイクル追加
2. ダイレクトページの開始アドレスがページ境界になっていない場合1サイクル追加
3. インデクス加算時にページ境界を超える場合は1サイクル追加
4. メモリモードフラグクリア時は3バイト。メモリモードフラグセット時は2バイト。
 
フラグ変化
nv----zc

n: アキュムレータのMSBがセットされる
v: サインドオーバーフローがあった場合にセットされる
z: 演算結果が0の場合にセットされる
c: 符号なしボロー(桁下がり)が発生しない場合にセットされる (これは内部演算で算術オーバーフローが発生した場合と等価)
解説
SBC命令はオペコードによって指定されたアドレッシングモードに従って、オペランドで指定された値をアキュムレータから引き、アキュムレータに結果を返します。
減算を行う命令ですが、内部的な実態は、加算器において2の補数を足すことに相当します。
アキュムレータが8ビット長の場合は符号付8ビット整数同士の減算を、16ビット長の場合は符号付16ビット整数同士の減算を行います。
演算の結果、桁下がりがない場合はオーバーフローフラグはクリアされ、キャリーフラグがセットされます。このとき、内部処理においては算術オーバーフローが発生しています。
また、演算の結果、符号が意図しないものとなった場合、すなわちサインドオーバーフローがあった場合はオーバーフローフラグがセットされ、キャリーフラグはクリアされます。

なお、キャリーフラグがクリアされている場合、SBC命令はさらに1を減算します。これは算術オーバーフローによる繰り下がりの有無を適切に表現するためです。


レジスタ幅を超える大きな数同士の減算を行う場合、次の例のように下位バイトから順に計算を行います。一連の操作において、キャリーフラグの状態を外部から変更してはいけません。
ただし、操作の開始時には必ずキャリーフラグをセットする必要があります。ちょうど筆算と同じような方法で行います。また、SBC命令がキャリー(のビット反転)を余分に引くという操作は、筆算における「繰り下がりの1を引く」操作と全く同じものです。
; SBC Sample
; Calculate #$13579BDF - #$2468ACE0 (= #$EEEEEEFF)

SEC		;		**m*****
LDA	#$9BDF	;		**m****C
SBC	#$ACE0	; A: 9BDF	Nvm***zC
STA	$00	; A: EEFF	Nvm***zc	#$9BDF - #$ACE0
LDA	#$1357	;
SBC	#$2468	; A: 1357	nvm***zc
STA	$02	; A: EEEE	Nvm***zc	#$1357 - #$2468 - !Carry
SEC		; Memory: FF EE EE EE
参照