【转自】http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=38&topic=37&show=0
Q:
字符串存储指令(STOS)的应用
- MOV AX ,SEG BUFDAT
- MOV ES ,AX
- MOV DI ,OFFSET BUFDAT
- MOV CX ,LENGTH BUFDAT
- MOV AL ,00
- CLD
- REP STOSB
问题补充:【为什么
有了这两句
CLD
REP STOSB
就可以往
BUFDAT中都存入0了呢?】
A:
CLD是清方向标志,把标识寄存器的D位置呈零。
字符串是一个一个字符的复制的,复制了第一个,第二个是向高地址取得,还是向低址取得?
CLD就是告诉后面的命令:字符串向高地址取得。
A:
如果Intel愿意,Rep当然也可以被设计为“Rep 目的,来源,长度,方向”的形式,实质是一样的,只是形式不同。 ----------------------------------- 为什么大部分语句如Add Eax,100不是这样?因为Mov的参数非常少,假如它的参数有3个以上,我们很可能会看到这样的Add: Mov eax,100 Mov ebx,200 Add ----------------------------- 也可以这样理解,"Rep"就相当于汇编里面的API,调用前要先设置其参数。
汇编语言中的rep指令的作用
Q:
- 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 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函数的反汇编代码中的一段代码,能告诉我这段代码有什么作用吗?
A:
重复执行后面的指令
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;
- }
- }
相当于这个函数的功能
A:
stos dword ptr [edi]
将此指令执行12次(根据ECX的值重复执行某行指令)
如果用汇编指令来描述他的作用的话就是
s: stos dword ptr [edi]
loop s