二、 增强指令功能
一些Prefix对Opcode 进行补充,增强指令的功能,优化指令执行,看下面这段c代码:
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代码一致,下面是伪码:
F3的另个prefix意思是 repe/repz,用于改变标志位的串操作:scas,cmps 意思是当相等并且循环次数(ecx)不为0时进行重复操作。
结束条件是ecx为0或者ZF标志位为0,或者说是循环条件是(ecx不为0,并且ZF标志位为1)
常见运用一些跳过字符的逻辑上,如下面C代码,用于截除串前面空格
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代码:
三、 附加功能(LOCK)
对于写内存的一些指令增加了锁地址总线的功能,这些写内存的指令如常见的mov,add等指令,通过Lock prefix来实现这功能,使用Lock prefix将会使processor产生LOCK# 信号锁地址总线
F0:LOCK prefix仅作用于写内存操作的指令上,也就是说:目标操作数为内存的指令。
到此 x86 prefix 讲解完毕
下一篇幅继续讲解 x64 prefix ------- REX prefix,因内容较多故单独讲解