首页
论坛
专栏
课程

[原创]深入浅出指令编码之二:指令格式(3)

2008-11-30 00:49 8950

[原创]深入浅出指令编码之二:指令格式(3)

mik
4
2008-11-30 00:49
8950
二、        增强指令功能
一些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,因内容较多故单独讲解

[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行

最新回复 (7)
书呆彭 6 2008-11-30 00:54
2
0
这么晚了,居然被我撞到。
mik 4 2008-11-30 01:02
3
0
也就是这么晚才有空花点时间写写。
你也这么晚
书呆彭 6 2008-11-30 01:04
4
0
唉,写程序,睡不着。
haras 2008-11-30 01:16
5
0
LZ && 书呆彭 这精神值得顶
greatbob 2008-11-30 07:02
6
0
LZ可不可以给个帖子索引,希望找全来看看,谢谢
北极狐狸 7 2008-12-1 09:46
7
0
呵呵.......啥话不说......
mik 4 2008-12-1 10:04
8
0
可以搜索主题"深入浅出指令编码”嘛
游客
登录 | 注册 方可回帖
返回