stosb, stosw, stosd 汇编基础

本文介绍了STOSB, STOSW, STOSD等汇编指令的基础知识及其应用场景,特别是如何利用这些指令高效地进行字符串或数组的填充操作,并提供了一个实际的ZeroMemory实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

stosb, stosw, stosd 汇编基础
我们来学习下另一组与字符串处理的指令。这组指令需要以指定的字符填充整个字符串或数组时比较有用。那么我们今天学习的这组指令就是stosb, stosw, stosd。这三个指令把al/ ax/ eax的内容存储到edi指向的内存单元中,同时edi的值根据方向标志的值增加或者减少。 同REP前缀联合使用的时候,这组指令需要填充整个字符串或数组时候比较有用。例如我们的MS提供的RtlZeroMemory函数,用的就是这三组指令来填充的。。


         举个例子:假设此时我声明了一个变量
  
         szBuffer   db   'hello world', 0
        
         我想通过一个循环将其hello world的这个字符串填充为0.

         那么此刻我们的代码该怎么写,大家先思考下。


         呵呵,那我就来给大家演示下:
  
         mov   edi, szBuffer
         xor   eax, eax
         mov   ecx,   11
         cld
         rep   stosb
  
       此刻执行完以上指令后,就会将我们szBuffer标号处(数据偏移)的内存单元用al来进行填充掉。

         上面呢就是简单的一个用0填充的过程,当然上面这个我们是用字节来填充的。而且没有加判断,那么下面我给大家一个之前写的一个ZeroMemoy过程,这个做了很多判断以及优化了下,给大家学习下。比微软提供的库函数执行效率要高一些。

     proc   ZeroMemory lpBuffer:DWORD, BufferSize:DWORD
           push edi
               mov   edi, [lpBuffer]
               mov   ecx, [BufferSize]
               xor   eax, eax
               mov   edx, ecx
               cld
               and   edx, 3
               shr   ecx, 4
               rep   stosd
               mov   ecx, edx
               rep   stosb
               pop   edi
               ret    
     endp

           好,今天的课程就这么多内容,关键大家要学会灵活使用stosb stosw stosd 指令。

       留个小作业:


     1.       例如此时我声明了一个变量,szBuffer,并且给这个变量偏移处赋值了一 段'http://www.hacker.com.cn'的字符串,那么此时我想用0整个填充字符串,代码该怎么写,用今天学到的知识。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值