REP与STOS串操作指令相结合使用怎么完成建立一组相同数据的字符串?

【转自】http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=38&topic=37&show=0

Q:
字符串存储指令(STOS)的应用

  1. MOV AX ,SEG BUFDAT 
  2. MOV ES ,AX 
  3. MOV DI ,OFFSET BUFDAT 
  4. MOV CX ,LENGTH BUFDAT 
  5. MOV AL ,00 
  6. CLD 
  7. 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:

  1. 00401060 55 push ebp 
  2. 00401061 8B EC mov ebp,esp 
  3. 00401063 83 EC 48 sub esp,48h 
  4. 00401066 53 push ebx 
  5. 00401067 56 push esi 
  6. 00401068 57 push edi 
  7. 00401069  7D B8 lea edi,[ebp-48h] 
  8. 0040106C B9 12 00 00 00 mov ecx,12h 
  9. 00401071 B8 CC CC CC CC mov eax,0CCCCCCCCh 
  10. 00401076 F3 AB rep stos dword ptr [edi]

问题补充:请问高手们,在main函数的反汇编代码中的一段代码,能告诉我这段代码有什么作用吗?

A:
重复执行后面的指令
rep stos dword ptr [edi]
是将edi指向的区域初始化为0CCCCCCCCh
应该是12h*4个字节,可以理解为一个函数,传来的某个参数为指针,然后将这个指针指向的区域初始化

  1. void fun(long *p) 
  2. int i; 
  3. // 12h=18 
  4. for(i=0;i<18;i++) 
  5. p[i]=0CCCCCCCCh; 

相当于这个函数的功能

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值