←前ページへ :  INDEX :  次ページへ→


7-3.REP ( Repeat ) :ストリング操作命令を繰り返す

 
MOVS?」命令だけでは1単位の転送しかできないため、ある領域の転送を行いたい場合にはこの「REP」命令と組み合わせて使う。

REP ( Repeat String 0peration )

例:REP MOVSB

   動作:[DS:SI]の内容1バイトを[ES:DI]に転送し、
          DF=1の時は、SI,DIを1減らす。
          DF=0の時は、SI,DIを1増やす。
          これをCX回繰り返す。
  影響を受けるフラグ:なし
したがって、100バイトのメモリーの転送を行いたい場合は、CX=100の状態で、「REP MOVSB」を実行すればよい。CXは何回繰り返すかであり、バイト数ではない 。したがって、CX=100の状態で「REP MOVSW」を実行すると200バイトのメモリーが転送される。またCX=0の時に「LOOP」を実行すると65536回繰り返されたが、「REP」命令は1回も実行されない


例)
	mov	si,1000h
	mov	di,2000h	
	mov	cx,100
	rep	movsb
というプログラムを「DF=1」の時に実行すると、900h〜1000hの内容が1900h〜2000hにコピーされる。 (SI,DIが減るため)

  ところが同じプログラムを「DF=0」の時に実行すると、1000h〜1100hの内容が2000h〜2100hにコピーされる。(SI,DIが増えるため)

  DFの設定の仕方は次ページに譲るとして、「REP」の兄弟を紹介する。「REPE(REPZ)」と「REPNE(REPNZ)」である。これは後述するストリング命令「SCAS?」、「CMPS?」と組み合わせて使う。「SCAS?」「CMPS?」は後述するように比較命令である。比較命令と言うことはお察しの通り、フラグが変化するのである。この「REPE(REPZ)」と「REPNE(REPNZ)」はゼロフラグ(ZF)とCXの値を見て終了するか、繰り返すかを決める。どう決めるかは下表の通りである。

繰り返しプリフィックス命令 終了条件 終了条件
REP CX=0 ZF=0(ただし、比較命令の時のみ)
REPE(REPZ) CX=0 ZF=0(ただし、比較命令の時のみ)
REPNE(REPNZ) CX=0 ZF=1(ただし、比較命令の時のみ)

  この表で、2つの終了条件はどちらかが成り立てば終了するものである。

  この表の通り、実は「REP」と「REPE(REPZ)」は同じものである。ただしストリング命令が比較命令の場合は「REPE(REPZ)」を用い、転送命令の場合は「REP」を用いるのが一般的である。

  なお、これらの命令の直後にストリング命令がない場合は、無視されます。


ストリング操作命令を繰り返す 《プレフィックス》 【86】
【書式】
 REP
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
以下の手順で後続のストリング操作命令を繰り返します。
@ アドレス サイズの属性が16ビットならばCXを、32ビットならばECXをカウンタとします。
A カウンタの内容が0ならば繰り返しを終了します。
B 保留されている割り込みがあるならば受け付けます。
C ストリング操作命令を一回実行します。
D カウンタから1を減じます。
E 手順Aに戻ります。
【備考】

←前ページへ :  INDEX :  次ページへ→