重复前缀  REP/REPE/REPNE/REPZ/REPNZ


rep movsb

用汇编语法来描述就是:

s: movsb

   loop s

这样REP/REPE/REPNE/REPZ/REPNZ后的指令,先执行一下,再查条件!类似于

.repeat

    指令

    [.break [.if 退出条件]]

    [.continue]

.until


重复前缀是用来控制其后的基本串操作指令是否重复,因而重复前缀不能单独使用。

(1). 有的串操作指令(如MOVS、LODS、STOS)可加重复前缀REP,这时指令规定的操作可重复进行,重复操作的次数由约定的CX寄存器的内容决定。CPU按以下步骤执行:

① 首先检查CX寄存器,若(CX) = 0,则退出REP操作;

② 指令执行一次字符串基本操作;

③ 根据DF标志修改地址指针;

④ CX减l (但不改变标志);

⑤ 重复① - ④。

  (2). 若串操作指令,如CMPS、SCAS的基本操作影响零标志ZF,则可加重复前缀REPE/REPZ或REPNE/REPNZ。此时串操作重复进行的条件为(CX)  0;同时还要求ZF的值满足重复前缀中的规定:REPE/REPZ要求(ZF) = 1;REPNE/REPNZ要求(ZF)= 0。  

 --------------------------

格式:REPE(或REPZ)String Primitive
其中String Primitive可为CMPS或SCAS指令。
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行。
2)执行其后的串指令
3)(CX)←(CX)-1
4)重复1)—3)
实际上REPE和REPZ是完全相同的,只是表达的方式不同而已。与REP相比,除满足(CX)=0的条件可结束操作外,还增加了ZF=0的条件。也不是说,只要两数相等就可继续比较,如果遇到两数不相等时可提前结束操作。

----------------------------

格式:REPNE(或REPNZ)String Primitive
其中String Primitive可为CMPS和SCAS指令。
执行的操作:
除退出条件为(CX)=0或ZF=1外,其他操作与REPE完全相同。也就是说,只要两数比较不相等,就可继续执行串处理指令,如某次两数比较相等或(CX)=0时,就可结束操作。

--------

格式:SCAS CST
      SCASB(字节)
      SCASW(字)

执行的操作:
字节操作:(AL)-((DI)),(DI)
←(DI)±1
字操作:(AX)-((DI)),(DI)←(DI)±2
指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码,指令的其他特性和MOVS指令的规定相同。
以上两条串处理指令和REPE/REPZ或REPNE/REPNZ相结合可以用来比较两个数据串,或从一个字符串中查找一个指定的字符。