汇编语言中的rep指令的作用

来源:百度知道 编辑:UC知道 时间:2024/05/16 12:12:43
00401060 55 push ebp
00401061 8B EC mov ebp,esp
00401063 83 EC 48 sub esp,48h
00401066 53 push ebx
00401067 56 push esi
00401068 57 push edi
00401069 8D 7D B8 lea edi,[ebp-48h]
0040106C B9 12 00 00 00 mov ecx,12h
00401071 B8 CC CC CC CC mov eax,0CCCCCCCCh
00401076 F3 AB rep stos dword ptr [edi]
请问高手们,在main函数的反汇编代码中的一段代码,能告诉我这段代码有什么作用吗?

重复执行后面的指令
rep stos dword ptr [edi]
是将edi指向的区域初始化为0CCCCCCCCh
应该是12h*4个字节,可以理解为一个函数,传来的某个参数为指针,然后将这个指针指向的区域初始化
void fun(long *p)
{
int i;
// 12h=18
for(i=0;i<18;i++)
{
p[i]=0CCCCCCCCh;
}
}
相当于这个函数的功能

stos dword ptr [edi]
将此指令执行12次(根据ECX的值重复执行某行指令)
如果用汇编指令来描述他的作用的话就是
s: stos dword ptr [edi]
loop s

1.rep movsd
每次ecx!=0便执行movsd ,然后ecx=ecx-1 movsd移动ds:[si] 到es:[di],在32位汇编下可以用esi代替si,edi代替di
2.同时由于在一般exe中ds = es
程序起始位置所以另esi = offset @s1就可以找到变量s1 ,edi= offset @s2就可以找到变量s2 。

3.movsd此类指令有个性质,当标志位d=0时执行一次esi = esi
+1,edi= edi+ 1

d=1时执行一次esi = esi +1,edi= edi+ 1

所以此段指令的含义是从s1复制ecx个dword到s2。