小B同学 发表于 2011-11-16 10:26:22

关于这个东东RtlZeroMemory

研究到win32汇编窗口时,其它部分基本能理解,就是这个RtlZeroMemory东东,不知道是用来干什么的,它有两个参数,第一个参数是取窗口类的首地址,第二个参数是窗口类结构的大小。高手来给我讲讲啊

xz785678006 发表于 2011-11-16 10:46:38

清零一块内存空间····

小B同学 发表于 2011-11-16 10:52:27

是不是给wndclass节构腾出一块内存空间 讲详细点呀,大哥

小B同学 发表于 2011-11-16 11:01:10

原来是把一块内存空间填O,因为结构中有的一些地方不填O且又不初始化,里面的数据可能是拉级数据,这样解释大家都懂

bingghost 发表于 2011-11-17 08:33:04

;P小B同学 这个名字 太有爱了   深有甲鱼老师风范啊

好了 进入正题吧
xor eax,eax                   ;要将这块内存的每个单元要初始化的数值 送入eax
mov edi,offset szString   ;获取这块内存的地址 送去edi
mov ecx,dwStingSize      ;这块内存的要初始化的长度 送去ecx
cld                               ;CLD使DF复位,即DF=0
rep stosb                      ;重复覆盖掉edi所指向的单元
REP         ;CX<>0 重复执行字符串指令
汇编指令stosb,stosw,stosd,分别是把AL,AX,EAX的内容存储到EDI所指的内存单元中,同时根据EDI的值根据方向标志增加或减少,可配合指令REP一起使用

另外:汇编指令MOVSB,MOVSW,意思是搬移一个字节或一个字,它是把 DS:SI 所指地址的一个字节搬移到 ES:DI 所指的地址上,搬移后原来的内容不变,但是原来 ES:DI 所指的内容会被覆盖而且在搬移之后 SI 和 DI 会自动的指向下一个要搬移的地址。

okay这些是本质的原理那么在继续看几个类似的API函数吧

bingghost 发表于 2011-11-17 08:37:32

:lol突然发现上面的 esi变笑脸了   - -

RtlMoveMemory   移动内存         ----> ?--->movsb
RtlFillMemory   填充内存块       --->eax = ? ---->stosb
RtlZeroMemory    以0填充内存块-->eax = 0 ----->stosb如果是sw,sd的话 那样计数的方式就不一样了
okay   想必lz 应该现在有一个更加清楚的认识了吧   

小B同学 发表于 2011-11-17 08:40:34

:o学习了,有空研究研究,先上班

杨江鹏 发表于 2012-12-11 18:33:00

那个程序的的意思是,local @stWndClass:WNDCLASS先是在栈中申请了一块地方,但这块地方乱七八糟的数字,所以要先清零,就好像去饭店吃饭,店小二给你找了张空桌,但桌上还有上桌客人留下吃剩盘子碟子没收拾,你要用桌子就得先得把桌子模干净一样!不过清零也可以自己清,用循环把0全填进去(你在VC++中看反汇编代码的时候,经常会看到这么做的),但用系统提供的填零函数更省事

狂潮丶 发表于 2016-4-10 10:58:45

bingghost 发表于 2011-11-17 08:37
:lol突然发现上面的 esi变笑脸了   - -

RtlMoveMemory   移动内存         ----> ?--->movsb


学习了,感谢楼主。
页: [1]
查看完整版本: 关于这个东东RtlZeroMemory