heap.asm

来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 81 行

ASM
81
字号
;********************
;文件:Heap.asm	    * 
;功能:演示堆的使用 *
;********************
.386p
.model flat,stdcall		;平坦内存模式
extrn _wsprintfA:PROC
extrn GetProcessHeap:PROC
extrn HeapCreate:PROC
extrn HeapAlloc:PROC
extrn HeapReAlloc:PROC
extrn HeapSize:PROC
extrn HeapFree:PROC
extrn MessageBoxA:PROC
extrn ExitProcess:PROC


NULL  = 0		;常量定义
MB_OK = 0		;
HEAP_NO_SERIALIZE               equ 00000001H
HEAP_GROWABLE                   equ 00000002H      
HEAP_GENERATE_EXCEPTIONS        equ 00000004H      
HEAP_ZERO_MEMORY                equ 00000008H      
HEAP_REALLOC_IN_PLACE_ONLY      equ 00000010H      

.data 
	Caption db '堆使用例程',0
	ErrText db '错误!',0
	Text	db 400 dup (0)
	Param	db '缺省堆名柄:%X;',10,13
			db '新建堆句柄:%X' ,10,13
			db '	|————|————|——————|',10,13
			db '	 分配块	  原来     重分配后		',10,13
			db '	|————|————|——————|',10,13
			db '	 大小         %X        %X',10,13
			db '	|————|————|——————|',10,13
			db '	   地址       %X         %X',10,13
			db '	|————|————|——————|',10,13
			db 0
		
	DefHeap	dd ?
	MyHeap	dd ?
	Size1	dd ?
	Size2	dd ?
	lpMem1	dd ?
	lpMem2	dd ?

.code
main:
	call GetProcessHeap		;取缺省堆句柄
	mov  [DefHeap],eax
	
	call HeapCreate,0,4096*3,0	;新建堆
	or   eax,eax
	jz   Error
	mov  [MyHeap],eax
	call HeapAlloc,eax,HEAP_ZERO_MEMORY,3000	;分配内存块
	or   eax,eax
	jz   Error
	mov  [lpMem1],eax
	call HeapSize,[MyHeap],0,eax	;取得分配块的大小
	mov  [Size1],eax
	call HeapReAlloc,[MyHeap],HEAP_ZERO_MEMORY,[lpMem1],8000	;重分配内存
	or   eax,eax
	jz   Error
	mov  [lpMem2],eax
	call HeapSize,[MyHeap],0,eax
	mov  [Size2],eax
	call HeapFree,[MyHeap],0,[lpMem2]	;释放
	
	call _wsprintfA,offset Text,offset Param,DefHeap,MyHeap,Size1,Size2,lpMem1,lpMem2
	add  esp,4*8
	
	call MessageBoxA,NULL,offset Text,offset Caption,MB_OK
	call ExitProcess,0
Error:	
	call MessageBoxA,NULL,offset ErrText,offset Caption,MB_OK
	call ExitProcess,0
	
	end main
	

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?