• rep stos dword ptr es:[edi]


    本文链接:https://blog.csdn.net/ypist/article/details/8467163
    今天读代码时,忽然跳出如下一条指令==>>
    汇编代码: 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
     }
    是没有任何作用的,只是为了让我们在反汇编时好定位代码的位置。
    ---------------------
    版权声明:本文为CSDN博主「pinggle」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ypist/article/details/8467163

  • 相关阅读:
    apache+php+mysql配置
    欧拉函数知识点总结及代码模板及欧拉函数表
    栈排序
    codeforces 722C (并查集)
    北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)
    HDU5898、 HDU 2089(数位DP)
    HDU 5876 (大连网赛1009)(BFS + set)
    codeforces 682D(DP)
    codeforces 666A (DP)
    codeforces 706D (字典树)
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/11349424.html
Copyright © 2020-2023  润新知