二、  增强指令功能
一些Prefix对Opcode 进行补充,增强指令的功能,优化指令执行,看下面这段c代码:

引用:
char *move_char(char *d, char *s, unsigned count)
{
    char *p = d;
    while (count--)
        *d++ = *s++;

    return p;
}
这是典型的、经典的字符串复制c代码,对应以下类似的汇编代码:
引用:
move_char:
        push ebp
        mov ebp, esp
        sub esp, 0xc
        mov eax, [ebp+8]
        mov edi, eax
        mov esi, [ebp+0xc]
        mov ecx, dword ptr [ebp+0x10]

move_loop:
        mov al, byte ptr [esi]
        mov byte ptr [edi], al
        inc esi
        inc edi
        dec ecx
        test ecx,ecx
        jnz move_loop

        mov esp, ebp
        pop ebp
        ret
上面的代码性能低下,是很死板的实现,优化的空间巨大。
x86为串提供了相应的串操作指令(ins,outs,lods,stos,scas,cmps),对这些串指令提供prefix来增强和优化这些指令:
● F3: rep prefix 或 repe prefix
● F2: repne prefix


1、rep prefix
重复进行串操作,仅应用于ins,outs,movs,lods,stos 这些不改变标志位的串指令,结束条件是ECX为0。
使用串操作及rep prefix上面的汇编代码可简单如下:
move_char:
… …
mov eax, [ebp+8]
mov edi, eax
mov esi, [ebp+0xc]
mov ecx, [ebp+0x10]
rep movsb… …

rep movsb的操作原理和上面的C代码一致,下面是伪码:
引用:
while (ecx != 0) {
    c = ds:[esi];
    es:[edi] = c;
    esi = esi + 1
    edi = edi + 1
    ecx = ecx  1;
}
2、repe prefix
F3的另个prefix意思是 repe/repz,用于改变标志位的串操作:scas,cmps 意思是当相等并且循环次数(ecx)不为0时进行重复操作。
结束条件是ecx为0或者ZF标志位为0,或者说是循环条件是(ecx不为0,并且ZF标志位为1)
常见运用一些跳过字符的逻辑上,如下面C代码,用于截除串前面空格
引用:
char *trim(char *s)
{
    while (*s && *s == ‘ ‘) s++;
    return s;
}
而用伪码表示为:
引用:
While (ecx != 0 and ZF = 1) {
    Ecx = ecx  1;
    cmps
}
rep 与 repe/repz 是相同的prefix,作用不用体现在对串指操作上:
movsb 的opcode是A4,scasb 的opcode 是AE,对于下面的encode:
F3 A4:这时 F3 prefix是REP
F3 AE:这时 F3 prefix是REPZ



3、  repne/repnz prefix
F2:这个prefix是repne/repnz,意思是循环次数(ecx)不为0并且ZF=0时重复操作。结束条件是:ecx=0或者ZF=1,同样也是用于改变标志位的串操作scas和cmps
常见一些查找字符的逻辑上,如下面C代码:
引用:
char *get_c(char *s, char c)
{
    while (*s && *s != c) s++;
    return s;
}
而用伪码表示为:
引用:
While (ecx !=0 and ZF != 1) {
    Ecx = ecx  1;
    cmps
}

三、  附加功能(LOCK)
对于写内存的一些指令增加了锁地址总线的功能,这些写内存的指令如常见的mov,add等指令,通过Lock prefix来实现这功能,使用Lock prefix将会使processor产生LOCK# 信号锁地址总线
F0:LOCK prefix仅作用于写内存操作的指令上,也就是说:目标操作数为内存的指令。


到此 x86 prefix 讲解完毕
下一篇幅继续讲解 x64 prefix ------- REX prefix,因内容较多故单独讲解