CMP 命令 (Compare Accumulator and Memory)

アキュムレータとメモリを比較し、結果をステータスフラグへ返します。
CPAはCMPのエイリアスです。

CMPオーバーロード

オペコード構文アドレッシングモードバイト数命令サイクル注
C9CMP #const
CPA #const
Imm.2/ 321, 4
C5CMP dpDP.231, 2
D2CMP (dp)DP. Ind251, 2
C7CMP [dp]DP. Ind long261, 2
D5CMP dp, XDP. Idx X241, 2
C1CMP (dp, X)DP. Idx Ind X261, 2
D1CMP (dp), YDP. Ind Idx Y251, 2, 3
D7CMP [dp], YDP. Ind long Idx Y261, 2
CDCMP absAbs.341
DDCMP abs, XAbs. Idx X341, 3
D9CMP abs, YAbs. Idx Y341, 3
CFCMP longAbs. long451
DFCMP long, XAbs. long Idx X451
C3CMP sp, SSR.241
D3CMP (sp, S), YSR. Ind Idx Y271

注

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

フラグ変化

n-----zc

n: 比較結果のMSBがセットされる
z: 比較結果が0の場合にセットされる
c: 比較結果において符号なし借り(桁下がり)が発生しない場合にセットされる (これは内部演算で算術オーバーフローが発生した場合と等価)

解説

CMP命令はオペコードによって指定されたアドレッシングモードに従って、オペランドで指定された値とアキュムレータを比較し、その結果をステータスフラグへ返します。
比較には減算が用いられ、アキュムレータからメモリの値を引きます。この命令によってアキュムレータおよびメモリの状態は変更されません。

結果が0の場合、すなわち、アキュムレータとメモリの値が等しい場合にはZフラグがセットされます。また、借りが発生しない場合、すなわちアキュムレータの値がメモリの値以上である場合はキャリーフラグがセットされます。

使用例

CMP命令は、比較の結果に応じて分岐命令で処理を振り分けるのに使います。符号なしの値の大小は、キャリーフラグを見るBCC・BCSで判定します。

大小による分岐

    LDA $10
    CMP.b #$40
    BCC .less       ; A < $40 のとき
    BEQ .equal      ; A = $40 のとき
    ; ここに来るのは A > $40 のとき

範囲のチェック

    ; A が $20~$3F の範囲にあるかを調べる
    CMP.b #$20
    BCC .out        ; $20 より小さい
    CMP.b #$40
    BCS .out        ; $40 以上
    ; ここに来るのは範囲内のとき

符号付きの値の大小を比べる場合は、キャリーフラグではなくネガティブフラグとオーバーフローフラグを組み合わせて判定する必要があります。

参照

SBC命令
CPX命令
CPY命令