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)