rep stos 指令(Intel汇编)

来源:互联网 发布:枪火兄弟连2 mac 存档 编辑:程序博客网 时间:2024/06/06 00:32

今天读代码时,忽然跳出如下一条指令==>>
汇编代码: rep stos dword ptr es:[edi]

在网上查了相关资料显示:
/************************************************************/
lea     edi,[ebp-0C0h] 
mov     ecx,30h 
mov     eax,0CCCCCCCCh 
rep stos dword ptr es:[edi]
rep指令的目的是重复其上面的指令.ECX的值是重复的次数.
STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址.


如果设置了direction flag, 那么edi会在该指令执行后减小, 
如果没有设置direction flag, 那么edi的值会增加.

 

REP可以是任何字符传指令(CMPS, LODS, MOVS, SCAS, STOS)的前缀. 
REP能够引发其后的字符串指令被重复, 只要ecx的值不为0, 重复就会继续. 
每一次字符串指令执行后, ecx的值都会减小.

stos((store into String),意思是把eax的内容拷贝到目的地址。
用法:stos dst,dst是一个目的地址,例如:stos dword ptr es:[edi]。dword ptr前缀告诉stos,一次拷贝双字(4个字节)的数据到目的地址。为什么一次非要拷贝双字呢?这和eax寄存器有关,到底神马关系,慢慢道来。。
执行stos之前必须往eax(32为寄存器)放入要拷贝的数据。上图中,eax的内容是cccccccc,不用说都明白int3中断。
这段代码是初始化堆栈和分配局部变量用的,往分配好的局部变量空间放入int3中断的原因是:防止该空间里的东东被意外执行。


/************************************************************/

想了想,没怎么明白,于是直接写了个函数,来加深一下印象:
/************************************************************/
#include <stdio.h>
int main()
{
 int i;
 int result=0;

 _asm{
  mov edi,edi
  mov edi,edi
 }

 for (i=0;i<20;++i)
  result+=2;
 return result;
}
/************************************************************/
其中,
 _asm{
  mov edi,edi
  mov edi,edi
 }
是没有任何作用的,只是为了让我们在反汇编时好定位代码的位置。

 

然后用OD打开,找到我们的代码处:
/************************************************************/


/************************************************************/

LEA: 目标地址传送指令: 将一个近地址指针写入到指定的寄存器。
区别MOV传送指令:MOV传送的是地址所指的内容,而LEA只是地址。

另外,在二进制中,0xCC 对应的就是汇编的:int 3指令(中断).


push ebpmov ebp,espsub  esp,40hpush ebxpush esipush edilea edi,[ebp-40h]mov ecx,10hmov eax,0CCCCCCCChrep stos dword ptr [edi]开始:// ESP = 0013FF30 EBP = 0013FF80push        ebp               // ESP = 0013FF2C EBP = 0013FF80mov         ebp,esp           // ESP = 0013FF2C EBP = 0013FF2C     <==== 注意 ESPsub         esp,40h           // ESP = 0013FEEC EBP = 0013FF2Cpush        ebx               // ESP = 0013FEE8 EBP = 0013FF2Cpush        esi               // ESP = 0013FEE4 EBP = 0013FF2Cpush        edi               // ESP = 0013FEE0 EBP = 0013FF2Clea         edi,[ebp-40h]     // ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEECmov         ecx,10h           // ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEEC ECX = 00000010mov         eax,0CCCCCCCCh    // ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEEC EAX = CCCCCCCCrep stos    dword ptr [edi]   // ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEF0 ECX = 0000000F// ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEF4 ECX = 0000000E// ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEF8 ECX = 0000000D....// ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FF20 ECX = 00000003// ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FF24 ECX = 00000002// ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FF28 ECX = 00000001结束:// ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FF2C ECX = 00000000EDI 是从低地址向高地址填充的! 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为短信验证码失败其他错误怎么办 红米3x手机卡顿反应慢怎么办 华为手机不停的自动重启怎么办 华为荣耀4x卡在开机界面怎么办 华为荣耀8青春版密码忘了怎么办 华为手机内存满了开不起来怎么办 华为荣耀畅玩平板2比较卡怎么办 红米4x太卡了怎么办 魅蓝e移动卡只有2g网络怎么办 联通关闭2g网络双卡手机怎么办 小米6x手机插耳机音量大怎么办 音量键和亮度键盘拆了怎么办 荣耀v10锁屏密码忘了怎么办 荣耀9锁屏密码忘记了怎么办 华为荣耀v9锁屏密码忘记了怎么办 荣耀手机密码忘了怎么办数字锁 华为畅享5忘了开机密码怎么办 华为p9连接热点忘了密码怎么办 苹果手机用联通卡信号不好怎么办 魅族手机充电口松了怎么办 华为手机刷机失败开不了机怎么办 华为刷机失败开不了机怎么办 银行卡信息被盗密码被改该怎么办 全民k歌手机话筒有杂音怎么办 手机刷机清除数据需要密码怎么办 oppo手机屏锁密码忘了怎么办 华为手机摔了一下开不了机怎么办 华为v9手机删除隐私空间了怎么办 华为荣耀畅玩5x卡顿怎么办 淘宝买家收到货后恶意退款怎么办 手机淘宝申请退款后不想退了怎么办 买房交首付时的收据发票掉了怎么办 苹果商城消费提示问题忘记了怎么办 psd文件超过2g不能存储怎么办 手机拍的照片做微信头像太大怎么办 上传的照片在等待中传不上去怎么办 淘宝购物车里的图片模糊怎么办 天猫超市一箱饮料少两瓶怎么办 网上卖一件代发顾客要退货怎么办 京东买东西卖家拒绝发货怎么办 淘宝不小心退款给买家了怎么办