rep stos 指令(Intel汇编)

本文详细解析了REPSTOSD指令的工作原理及其应用场景,包括如何使用此指令进行内存初始化,并通过具体示例帮助读者更好地理解其工作流程。

转载自:http://blog.youkuaiyun.com/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,一次拷贝双字(32个字节)的数据到目的地址。为什么一次非要拷贝双字呢?这和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指令(中断).

 


<think>好的,我现在要回答用户关于`rep stos`指令在x86汇编中的作用的问题。首先,我需要回忆一下相关的汇编知识,并结合提供的引用资料来确保准确性。 根据用户提供的引用,特别是引用[2]和引用[4],`rep`是重复前缀,而`stos`是字符串存储指令。引用[2]提到,重复前缀会使得字符串指令重复执行,次数由CX寄存器决定。引用[4]则说明`stos`指令将数据存入内存,并根据方向标志DF调整目标地址。 接下来,我需要将这两个部分结合起来。`rep stos`组合使用时,应该会重复执行`stos`指令,次数由CX的值决定。每次执行时,`stos`会把AL/AX/EAX中的值存储到EDI指向的内存位置,然后EDI根据DF的值增减。例如,如果DF=0(使用CLD指令清除),EDI会递增;如果DF=1(使用STD指令设置),EDI会递减。 需要确认的是,`stos`的操作数大小如何影响使用的寄存器。比如,`stosb`对应字节操作,使用AL;`stosw`对应字,使用AX;`stosd`对应双字,使用EAX。用户的问题是关于x86的,所以可能需要提到不同位数的情况。 此外,应用场景方面,常见的是内存初始化,比如将某块内存设置为特定值,类似于C语言的memset函数。这可以引用资料中的例子来说明。 还需要注意,`rep stos`执行后,CX会被减到0,而EDI会指向填充后的下一个位置。这可能影响后续指令,需要注意寄存器的状态变化。 最后,检查是否有其他引用资料相关的内容需要补充。比如引用[3]中提到了XLAT等指令,但和当前问题无关。所以主要参考引用[2]和[4]。 总结:`rep stos`的作用是重复存储某个值到内存块,次数由CX指定,使用AL/AX/EAX的值,EDI作为指针自动调整。常用于快速初始化内存区域。</think>### REP STOS 指令功能解释 `rep stos` 是 x86 汇编中用于高效内存操作的组合指令,由**重复前缀 `rep`** 和**字符串存储指令 `stos`** 共同构成。以下是其核心功能分步说明: 1. **指令组成** - **`rep`**:重复前缀,根据 `CX/ECX/RCX` 寄存器的值重复执行后续指令[^2]。 - **`stos`**:字符串存储指令,将寄存器(`AL/AX/EAX`)的值写入目标内存地址,并自动更新目标指针 `EDI`[^4]。 2. **操作流程** - **目标内存地址**:由 `EDI` 寄存器指向。 - **填充值**:取自 `AL`(字节操作)、`AX`(字操作)或 `EAX`(双字操作)。 - **重复次数**:由 `CX/ECX/RCX` 寄存器指定。 - **方向调整**:根据方向标志 `DF`(Direction Flag): - `DF=0`(默认,使用 `CLD` 指令设置):`EDI` 递增。 - `DF=1`(使用 `STD` 指令设置):`EDI` 递减。 3. **典型应用场景** - **内存初始化**:快速填充连续内存区域为固定值(类似 C 语言的 `memset` 函数)。 - **性能优势**:单条指令可替代循环写入操作,显著提升效率。 4. **示例代码片段** ```assembly ; 初始化 100 字节内存为 0xFF mov edi, DestinationAddress ; 目标地址 mov al, 0FFh ; 填充值 mov ecx, 100 ; 重复次数 cld ; 设置递增方向 rep stosb ; 逐字节填充 ``` 5. **寄存器影响** - `EDI`:最终指向操作结束后的下一个内存位置。 - `ECX`:归零。 - `AL/AX/EAX`:值保持不变。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值