WIN32汇编语言教程:第10章 内存管理和文件操作 · 10.1 内存管理(8)

而下面的代码可以将szDest处的dwSize字节填充为0:

xor eax,eax

mov edi,offset szDest

mov ecx,dwSize

cld

rep stosb

如果把xor eax,eax换成mov al,xx,那么完成的功能就是将这块内存填充为xx。

虽然填充和移动的功能这么简单,但Win32中还是有对应的API函数:

invoke RtlMoveMemory,offset szDest,offset szSource,dwSize ;移动内存
invoke RtlFillMemory,offset szDest,dwSize,dwFill  ;以dwFill填充内存块
invoke RtlZeroMemory,offset szDest,dwSize         ;以0填充内存块

可以看到,使用这些函数时,仅传递参数和调用的开销就远远超过了前面举例的两段代码,但是使用它们的可读性比较好,所以在具体的使用中要有所取舍。如果执行速度比较重要,比如是在一个循环中使用,同样的代码要被使用很多遍,还是应该使用嵌入的几句汇编代码;如果为了让程序看上去简洁一些,那就不妨使用这几个API函数。

2. 内存状态测试

有时候在访问一块内存之前,可能想知道这块内存的属性究竟是什么,是可写的?可读的?还是可执行的?这些功能可以用测试函数来完成:

   invoke IsBadCodePtr,lpMemory
   invoke IsBadReadPtr,lpMemory,dwSize
   invoke IsBadWritePtr,lpMemory,dwSize
   invoke IsBadStringPtr,lpMemory,dwSize

这些函数的功能如下:

● IsBadCodePtr函数测试某个指针指向的单个字节是否可读,如果可读则返回0,否则返回非0值。

● IsBadReadPtr函数测试某段内存是否可读,如果这段内存的所有字节都是可读的,则返回0,如果中间包含有不可读的字节则返回非0值。

● IsBadWritePtr函数测试某段内存是否可写,如果这段内存的所有字节都是可写的,则返回0,如果中间包含有不可写的字节则返回非0值。

● IsBadStringPtr函数测试的同样是可读性,lpMemory参数指向一个以0结尾的字符串,字符串的最大长度为dwSize,如果整个字符串包含结尾的一个0都是可读的,则函数返回0,否则返回非0值。缓冲区中剩余的字节则不予测试。

上页:第10章 内存管理和文件操作 · 10.1 内存管理(7) 下页:第10章 内存管理和文件操作 · 10.2 文件操作(1)

第10章 内存管理和文件操作

版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号