今天读代码时,忽然跳出如下一条指令==>>

汇编代码: 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 ebp
mov ebp,esp
sub esp,40h
push ebx
push esi
push edi
lea edi,[ebp-40h]
mov ecx,10h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi] 开始:
// ESP = 0013FF30 EBP = 0013FF80 push ebp // ESP = 0013FF2C EBP = 0013FF80 mov ebp,esp // ESP = 0013FF2C EBP = 0013FF2C <==== 注意 ESP sub esp,40h // ESP = 0013FEEC EBP = 0013FF2C push ebx // ESP = 0013FEE8 EBP = 0013FF2C push esi // ESP = 0013FEE4 EBP = 0013FF2C push edi // ESP = 0013FEE0 EBP = 0013FF2C lea edi,[ebp-40h] // ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEEC mov ecx,10h // ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEEC ECX = 00000010 mov eax,0CCCCCCCCh // ESP = 0013FEE0 EBP = 0013FF2C EDI = 0013FEEC EAX = CCCCCCCC rep 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 = 00000000 EDI 是从低地址向高地址填充的!

rep stos 指令(Intel汇编)的更多相关文章

  1. rep stos dword ptr es:[edi]

    本文链接:https://blog.csdn.net/ypist/article/details/8467163今天读代码时,忽然跳出如下一条指令==>>汇编代码: rep stos dw ...

  2. rep stos ptr dword es:[edi]

    今天读代码时,忽然跳出如下一条指令==>>汇编代码: rep stos dword ptr es:[edi] 在网上查了相关资料显示:/************************** ...

  3. AT&T 和 Intel 汇编语法的主要区别

    转自AT&T 和 Intel 汇编语法的主要区别 作为一个爱折腾的大好青年,补番之余还要补一些 Linux 下的基础,比如 GDB 的正确使用方法.但无论是看 gdb 还是 gcc -S 里的 ...

  4. a gcc 4.2.4 bug(被stos指令累加后%edi作为参数的)

    a gcc 4.2.4 bug(被stos指令累加后%edi作为参数的) * * Ok, now we can initialize the rest of the tty devices and c ...

  5. Linux下AT&T汇编语法格式与Intel汇编语法格式异同

    由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的.但在Unix和Linux系统中,更多采用的还是AT&a ...

  6. stos指令

    mov ecx,30mov eax,0cccccccchrep stos dword prt es:[edi]stos指令,它的功能是将eax中的数据放入的edi所指的地址中,同时,edi会增加4个字 ...

  7. 《Intel汇编第5版》 Intel CPU小端序

    一.MASM汇编器中的数据类型 二.Intel汇编中的立即数类型 三.定义有符号和无符号整数 四.小端序 内存中数据按照字节存储,一个4个字节无符号整数,其高位存储在低地址上,低位存储在高地址上. 比 ...

  8. 《Intel汇编第5版》 Mov指令

    一.Mov用于数据传送,用法如下: 二.当传送的数据和目标数据位宽不一致的时候,需要使用MOVZX.MOVSX扩展.MOVZX使用0填充高位,MOVSX使用源操作数最高位填充 下面是汇编代码演示: I ...

  9. linux 下gcc生成intel汇编

    留作备忘: gcc -S -masm=intel xxxx.c 生成elf可执行文件: gcc -o xxx xxxx.s 反汇编 objdump xxx 补充: 在使用gcc 对C语言程序进行编译时 ...

随机推荐

  1. Google被墙怎么办?

    Google被墙怎么办? 1 声明 请小伙伴们遵守法律法规,我们只是为了更好的查询学习资料. 想使用Google查询相关资料 想使用Google账号管理收藏夹 想使用Google商店安装软件 == 2 ...

  2. nginx优势,依赖,启动

      Nginx Nginx优势1.nginx将网络,磁盘及定时器等异步事件的驱动都做了非常好的封装,基于它开发将可以忽略这些事件处理的细节.2.Nginx封装了许多平台无关的接口,容器,适用于跨平台开 ...

  3. 微信生成二维码 PHP

    <?php /** * Created by PhpStorm. * User: liyiming * Date: 2019/8/8 * Time: 14:23 */ # 生成二维码 class ...

  4. Ant Design Pro路由传值

    Ant Design Pro 路由传值 了解Ant Design Pro组件间通讯原理的小伙伴肯定都知道,两个页面之间可以通过Models进行传值,在以往的传值过程中,我都是直接将需要的值直接一股脑的 ...

  5. 2018铁人三项测评题 IOS99

    下面这一部分是我从网上复制过来的, 2.IOS 解题链接:http://ctf4.shiyanbar.com/web/IOS/index.php 这题页面中提示系统升级到了IOS99,我们可以想到修改 ...

  6. 【记】Linux下安装JDK1.7

    Java官网已经不提供除最新版本以外版本的JDK下载了,下载JDK1.7,密码: rsqg 本地Linux系统为Centos6.9,本身就没安装Java:已安装Java需要先卸载,卸载方法请百度. 1 ...

  7. C语言之数组用法总结

    一维数组的定义:1.数组的数据类型:每一元素占内存空间的字节数.2.数组的存储类型:内存的动态. 静态存储区或CPU的寄存器.3.一维数组在内存中占用的字节数为:数组长度X sizeof (基类型). ...

  8. Ambari下安装oozieUI界面无法访问问题

    前言: 其他集群管理工具安装oozie和手动编译安装oozie,关于oozie的UI界面无法访问的问题,大致和该方法类似. 找到下面4步骤里的视图显示的目录,有一个ext-2.2软链指向的路径 lrw ...

  9. 安装lxml

    1.安装wheel pip3 install -i https://pypi.douban.com/simple wheel 2.下载lxml库的whl文件 下载地址:https://www.lfd. ...

  10. [题解]CSP2019 Solution - Part B

    \(\text{orz}\) 一波现场 \(\text{A}\) 掉 \(\text{D1T3}\) 的神仙 D2T3 centroid Solution 考虑每个点 \(u\) 作为重心的贡献 假设 ...