←前ページへ :  INDEX :  練習問題へ→


7-8.CMPS? ( Compare String ) :ストリングの比較

CMPSB ( Compare String Bytes ) :ストリングのバイト比較

CMPSB

   動作:[DS:SI]と[ES:DI]とを比較する
          DF=1の時は、SI,DIを1減らす。
          DF=0の時は、SI,DIを1増やす。
  影響を受けるフラグ:OF,SF,ZGF,AF,PF,CFが結果を反映する

CMPSW ( Compare String Words ) :ストリングのワード比較

CMPSW

   動作:[DS:SI]と[ES:DI]とを比較する
          DF=1の時は、SI,DIを2減らす。
          DF=0の時は、SI,DIを2増やす。
  影響を受けるフラグ:OF,SF,ZGF,AF,PF,CFが結果を反映する

CMPSD ( Compare String Doublewords ) :ストリングのダブルワード比較

CMPSD	(80386以上)

   動作:[DS:SI]と[ES:DI]とを比較する
          DF=1の時は、SI,DIを4減らす。
          DF=0の時は、SI,DIを4増やす。
  影響を受けるフラグ:OF,SF,ZGF,AF,PF,CFが結果を反映する
  上のニーモニック表の通り、「CMPS?」命令は[DS:SI]の内容と[ES:DI]の内容を比較する。 SI,DIが増えるか減るかは、「MOSV?」と同様、DF(フラグ)によって変わる。

  この命令は主に、次の用途に使われる。

CXにデータ領域のバイト数を入れ「REPNE(REPNZ)」と組み合わせ、データの内容が同じであるかどうかを調べる
  「SCAS?」と同様、REPE(REPZ)/REPNE(REPNZ)を抜けたときのSI,DIはひとつずれていることに注意してください。

ストリングの比較 【86】
【書式】
 CMPS  {segreg:}source,{ES:}dest
 dest   = mem   source = mem
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
32ビット属性のセグメントの場合、以下のSIはESI、DIはEDI、CXはECXになります。
source からdest を減算し、結果に従ってフラグを設定します。
source で示される segreg:[SI] dest で示される ES:[DI]
SIとDIをオペランドのサイズに従って増減します。DFが0ならば増加し、DFが1ならば減少します。
SI SI ± オペランドのサイズ
DI DI ± オペランドのサイズ
【備考】
  • オペランドは省略できず、sourcedest は同じサイズでなければいけません。
  • オペランドが指定されていてもセグメントを変更しない場合、source のアドレスは常にDS:[SI]で、dest は常にES:[DI]となります。 source だけがセグメントを変更できます。
  • 減算結果が格納されないことを除きSUB命令と動作は同じです。 但し、sourcedest が逆になっています。
  • 繰り返し用のプレフィックス命令が使用できます。 CXに最大比較回数を設定して、REPNE/REPNZを用いれば最初の一致を、REPE/REPZを用いれば最初の不一致を検出できます。 繰り返し終了後にCXが0ならば検出できなかったことを表わし、そうでなければ、インデックス(ポインタ)は最初の不一致(または―致)の次の位置を指しています。
【用例】
CMPSB命令を使用した文字列比較の例を以下に示します。
 
CLD            ;
方向フラグを+方向に設定
LEA   ESI,PNT1 ;
基準文字列先頭ポインタを設定
LEA   EDI,PNT2 ;
対象文字列先頭ポインタを設定
MOV   ECX,BCNT ;
比較バイト数をカウンタに設定
REPZ  CMPSB    ;
不一致か完全一致まで比較
JZ    MATCH    ;
完全一致で分岐

←前ページへ :  INDEX :  練習問題へ→