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」を用いるのが一般的である。
なお、これらの命令の直後にストリング命令がない場合は、無視されます。