rep stos ptr dword es:[edi]

今天读代码时,忽然跳出如下一条指令==>>
汇编代码: 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指令(中断).

rep stos ptr dword es:[edi],布布扣,bubuko.com

时间: 2024-10-25 16:27:39

rep stos ptr dword es:[edi]的相关文章

利用repne scas byte ptr es:[edi]计算字符串长度

edi:存放字符串al:存放字符xrepne scas byte ptr es:[edi] :遍历字符串,每循环一次ecx-1,遇到字符x则停止汇编中一个很经典的计算字符串长度的方法便是利用了这条指令. 00406930 /$ 89FA mov edx,edi 00406932 |. 89C7 mov edi,eax ;edi里为存放的字符串 00406934 |. B9 FFFFFFFF mov ecx,-0x1 ;ecx放入-1 00406939 |. 30C0 xor al,al ;al=

操作系统内核Hack:(三)BootLoader制作

操作系统内核Hack:(三)BootLoader制作 关于本文涉及到的完整源码请参考MiniOS的v1_bootloader分支. 1.制作方法 现在我们已经了解了关于BootLoader的一切知识,让我们开始动手做一个BootLoader吧!但真正开始之前,我们还要做出一个选择,在之前的讨论中我们曾说过,有两种学习和制作引导程序和操作系统内核的路线:1)<Orange's:一个操作系统的实现>书中的路线:2)Linux 0.11的路线. 1.1 两种实现思路 具体来说,第一种路线就是将Boo

等号赋值与memcpy的效率问题

转自:http://www.aiuxian.com/article/p-1309055.html 偶尔看到一个说法,说,小内存的拷贝,使用等号直接赋值比memcpy快得多.结合自己搜集到的资料,整理成此文. 事实:strcpy等函数的逐字节拷贝,memcpy是按照机器字长逐字进行拷贝的,一个字等于4(32位机)或8(64位机)个字节.CPU存取一个字节和存取一个字一样,都是在一条指令.一个内存周期内完成的.显然,按字拷贝效率更高. 先给出一个程序: 01 #include <stdio.h>

stos 串存储指令

stos 包括 stosb   stosw   stosd, 涉及的寄存器是eax, edi, 功能如下: stosb    将al中的值复制到 byte ptr es:[edi] 中, 同时edi++ stosw    将ax中的值复制到 word ptr es:[edi] 中, 同时edi++ stosd    将eax中的值复制到 dword ptr es:[edi] 中, 同时edi++ 例子: int a[0x22] = {0};    //平时习惯的初始化方法,  但由于汇编时调用了

汇编之 eax, ebx, ecx, edx, esi, edi, ebp, esp??

一般寄存器:AX.BX.CX.DXAX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI.DISI:来源索引暂存器,DI:目的索引暂存器 堆叠.基底暂存器:SP.BPSP:堆叠指标暂存器,BP:基底指标暂存器 EAX.ECX.EDX.EBX:為ax,bx,cx,dx的延伸,各為32位元ESI.EDI.ESP.EBP:為si,di,sp,bp的延伸,32位元 eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU

c++反汇编与逆向分析 小结

第一章  熟悉工作环境和相关工具1.1 熟悉OllyDBG  操作技巧1.2 反汇编静态分析工具 IDA(最专业的逆向工具)    快捷键    功能     Enter     跟进函数实现     Esc       返回跟进处    A         解释光标处的地址为一个字符串的首地址     B         十六进制数与二进制数转换    C         解释光标处的地址为一条指令     D         解释光标处的地址为数据,没按一次将会转换这个地址的数据长度   

visual_c++外挂教程(详细)

课程分四个大章节 初级篇,中级篇,进阶篇,高级篇 初级篇内容:编写一个完整的,简单的外挂 C++的数据类型:Byte,Word,DWORD,int,float API函数的调mouse_event,GetWindowRect,SetCursorPos,FindWindow,SendMessage) CE5.4工具的使用方法 中级篇内容:调试工具的使用技巧,功能CALL的概念 调试工具OD1.1的使用技巧(如硬件断点,条件断点,内存断点. 常用汇编指令与对应高级语言的转换. 游戏功能CALL概念

汇编语言1:初识汇编

我这里学习汇编语言的思路就是逆向C++源码. 先从最简单的一个程序入手: 为什么程序的开头两句总会是 push ebp mov ebp,esp ? 先来看一个程序: 这个程序调用fun()时,fun的汇编代码也是如此,开头调用这两句汇编: 其实,这里ebp中保存的是你当前的函数(main函数)的栈基址,当你进入一个子函数(func函数)的时候,你要使用这个子函数的栈空间,此时进入子函数的栈空间就要先保存当前函数的栈基址.将此时的 esp 赋予 ebp 以便后面用 ebp 来作为栈基并以此通过 [

浅析VS2010反汇编

第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗口