CPX 命令 (Compare Index Register X and Memory)
インデクスレジスタXとメモリを比較し、結果をステータスフラグへ返します。
CPXオーバーロード
| オペコード | 構文 | アドレッシングモード | バイト数 | 命令サイクル | 注 |
|---|---|---|---|---|---|
| E0 | CPX #const | Imm. | 2/ 3 | 2 | 1, 3 |
| E4 | CPX dp | DP. | 2 | 3 | 1, 2 |
| EC | CPX abs | Abs. | 3 | 4 | 1 |
注
- インデクスフラグクリア時は1サイクル追加
- ダイレクトページの開始アドレスがページ境界になっていない場合1サイクル追加
- インデクスフラグクリア時は3バイト。インデクスフラグセット時は2バイト。
フラグ変化
n-----zc
n: 比較結果のMSBがセットされる
z: 比較結果が0の場合にセットされる
c: 比較結果において符号なし借り(桁下がり)が発生しない場合にセットされる (これは内部演算で算術オーバーフローが発生した場合と等価)
解説
CPX命令はオペコードによって指定されたアドレッシングモードに従って、オペランドで指定された値とXレジスタを比較し、その結果をステータスフラグへ返します。
比較には減算が用いられ、Xレジスタからメモリの値を引きます。この命令によってXレジスタおよびメモリの状態は変更されません。
結果が0の場合、すなわち、Xレジスタとメモリの値が等しい場合にはZフラグがセットされます。また、借りが発生しない場合、すなわちXレジスタの値がメモリの値以上である場合はキャリーフラグがセットされます。
使用例
ループの終わりを判定する
; 16ビットの値の表を順に処理する(Xは16ビット)
LDX.w #$0000
.loop
LDA.l Table,X
; ... 1要素分の処理 ...
INX
INX
CPX.w #TableEnd-Table
BCC .loop ; X < 表の大きさ なら繰り返す