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

ADCオーバーロード
オペコード 構文 アドレッシングモード バイト数 命令サイクル
A8
SBC A, #const
Immediate
2
2
1
A6
SBC A, (X)
Indirect
1
3
1
A4
SBC A, dp
Direct Page
2
3
1
B4
SBC A, dp+X
Direct Page X-Indexed
2
4
1
A5
SBC A, !abs
Absolute
3
4
1
B5
SBC A, !abs+X
Absolute X-Indexed
3
5
1
B6
SBC A, !abs+Y
Absolute Y-Indexed
3
5
1
A7
SBC A, (dp+X)
Direct Page X-Indexed Indirect
2
6
1
B7
SBC A, (dp)+Y
Direct Page Indirect Y-Indexed
2
6
1
B9
SBC (X), (Y)
Y-Indirect to X-Indirect
1
5
2
A9
SBC dp, dp
Direct Page to Direct Page
3
6
2
B8
SBC dp, #const
Immediate to Direct Page
3
5
2


1. 結果はアキュムレータに返される
2. 結果は第1オペランドに指定されたメモリに返される
 
フラグ変化
nv--h-zc

n: アキュムレータのMSBがセットされる
v: サインドオーバーフローがあった場合にセットされる
h: bit4からbit3への繰り下がりがなかった場合にセットされる
z: 演算結果が0の場合にセットされる
c: 算術オーバーフローがあった場合にセットされる

解説
SBC命令はオペコードによって指定されたアドレッシングモードに従って、オペランドで指定された値とアキュムレータまたはメモリの間で差を取り、アキュムレータまたはメモリに結果を返します。
演算の結果、ビット8への繰下がり、すなわち算術オーバーフローがあった場合はオーバーフローフラグはクリアされ、キャリーフラグがセットされます。
また、演算の結果、符号が意図しないものとなった場合、すなわちサインドオーバーフローがあった場合はオーバーフローフラグがセットされ、キャリーフラグはクリアされます。

なお、キャリーフラグがクリアされている場合、SBC命令はさらに1を引きます。これはオーバーフローによる桁借りを適切に表現するためです。

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

; SBC Sample
; Calculate #$1357 - #$2468 (= #$EEEF)

SETC			; ***-*-**
MOV	$00, #$57	; ***-*-*C
MOV	$01, #$13	; n**-*-zC
SBC	$00, #$68	; n**-*-zC	($00) -= #$68	
SBC	$01, #$24	; Nv*-H-zc	($01) -= #$24	$00: EF
***			; Nv*-H-zc			$01: EE
参照