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

汇编代码: 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. 1026 程序运行时间 (15 分)C语言

    题目描述 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tic ...

  2. 1048 数字加密 (20 分)C语言

    本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...

  3. yum回滚至Kubernetes1.15.7版本

    背景:升级Kubernetes版本从1.14.1-->1.17.0,官方说明不能跨版本升级,所以只好一个版本一个版本升级.最终升到1.17.0后发现API的格式有改动,之前的中间件版本很多不支持 ...

  4. FIND_IN_SET 精确查找

    FIND_IN_SET(str,strlist) mysql专为精确匹配字符串而设置的函数 一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串 1,2,3,4,5,6,7,8,9: 此函数 ...

  5. Redis 千万不要乱用KEYS命令,不然会挨打的

    Redis现如今使用的场景越来越多?如何批量删除key呢? 有人说用KEYS命令,刚开始学Redis的时候就是用这个命令列出库中键. KEYS命令要谨慎使用. 为何?客观别急,我们先一步步来看. KE ...

  6. iOS - 点击背景视图收起系统键盘

    我们在 IOS 开发中经常会需要在输入框输入数据后,需要收起系统键盘,比如由于手机屏幕不是很大,可能由于输入信息后,系统键盘就会遮挡住下一步的按钮,而系统键盘有没有收起键,所以我们可以实现点击背景视图 ...

  7. 【转】面向GC的Java编程

    Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题.以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象, ...

  8. Sql Server执行一条Update语句很慢,插入数据失败

    今天同事要我修改服务器数据库里面的2条数据,查看服务器上的SQL Server数据库的时候,发现这几天数据没有添加成功,然后发现磁盘很快就满了,执行Update语句时,执行半天都提示还在执行,查询语句 ...

  9. jQuery, 文本框获得焦点后, placeholder提示文字消失

    文本框获得焦点后, 提示文字消失, 基于jQuery, 兼容性: html5 //所有文本框获得焦点后, 提示文字消失 $('body').on('focus', 'input[placeholder ...

  10. MVEL2.0的使用实例(一)

    本文是对java整合mvel2.0的一点示例: 如果表达式中有变量,解析表达式时必须传一个map MVEL.eval(expression, vars); /** * 基本解析表达式 */@Testp ...