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 + -
显示快捷键?