闲着无事2 RtlFillMemory

RtlFillMemory(Destination, Length, Fill)
; edi压栈
80543f20 57              push    edi
; edi=第1个参数(Destination)
80543f21 8b7c2408        mov     edi,dword ptr [esp+8]
; ecx=第2个参数(Length)
80543f25 8b4c240c        mov     ecx,dword ptr [esp+0Ch]
; al=第3个参数(Fill) ah不变,内容不确定
80543f29 8a442410        mov     al,byte ptr [esp+10h]
; ah=al=第3个参数(Fill)
80543f2d 8ae0            mov     ah,al
; eax左移16位,对于32位寄存器来说,就是低16位(al)清0,高16位(ah)=al
80543f2f c1e010          shl     eax,10h
; 再取一次参数,al=第3个参数 ah不变,现在是ah=al=第3个参数
80543f32 8a442410        mov     al,byte ptr [esp+10h]
; ah=al
80543f36 8ae0            mov     ah,al
; ******* 从以上的处理过程看,编译器还有点冗余的,人写只要2句就可以了
; mov al, byte ptr [esp+10]
; mov ah, al
; ******* 编译器倒了好几次
; 清方向标志位,使DF=0,这个意思是串存储指令中edi做加操作,向高地址方向移动
; 如果DF=1,串存储指令中edi做减操作,向低地址方向移动。
80543f38 fc              cld
; edx=ecx=第2个参数
80543f39 8bd1            mov     edx,ecx
; 第2个参数和3(二进制11)做与运算,结果是只保留低2位到edx
80543f3b 83e203          and     edx,3
; 第2个参数右移2位,相当于除以4,这里有2个注意点:
; 1 为什么要把第2个参数(也就是长度)除以4
;   因为接下来的串存储指令是按照dword进行的,而传入的参数中,长度是字节,所以要计算出有几个双字
; 2 按照1的计算,如果不是dword的整数,余下的几个字节怎么办?
;   可以参考and edx, 3这一句,这里把二进制表示的低2位保存到edx中(其实就是把余数保存到edx中),
;   等dword的串存储完成以后,再把余数按照byte进行串存储操作
80543f3e c1e902          shr     ecx,2
; 这里开始串存储操作,从eax(注意上面对eax的操作,最初从栈上传入的参数是字节,经过操作以后,
; eax寄存器的ah和al都是这个字节,然后dwrod一次操作2个eax,效率高)存储到edi(就是第1个参数,
; 用户指定的内存区域)指向的区域,edi每次加4,ecx减1,直到ecx为0,就不再操作。
80543f41 f3ab            rep stos dword ptr es:[edi]
; ecx现在是0,这条指令把edx的值赋给ecx,根据结果设置ZF标志位
80543f43 0bca            or      ecx,edx
; 如果不是0,也就是说长度不是4的整数倍,还有小于4的字节需要处理,转到80543f4b继续处理
80543f45 7504            jne     nt!RtlFillMemory+0x2b (80543f4b)
; 恢复edi
80543f47 5f              pop     edi
; 返回并平衡堆栈
80543f48 c20c00          ret     0Ch

nt!RtlFillMemory+0x2b:
; 这里直接开始串存储操作,把eax中的值按照byte存储到edi中,
; edi每次加1,ecx减1,注意这时候ecx中记录的是字节的个数
80543f4b f3aa            rep stos byte ptr es:[edi]
; 恢复edi
80543f4d 5f              pop     edi
; 返回并平衡堆栈
80543f4e c20c00          ret     0Ch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值