;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Fragment.asm; 重复分配和释放固定内存块使内存碎片化; Windows NT 下使用。;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 使用 nmake 或下列命令进行编译和链接:; ml /c /coff Fragment.asm; rc Fragment.rc; Link /subsystem:windows Fragment.obj Fragment.res;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .386 .model flat, stdcall option casemap :none;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Include 文件定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>include windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.lib;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Equ 等值定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ICO_MAIN equ 1000DLG_MAIN equ 100IDC_MEMORY equ 101IDC_COUNT equ 102IDC_INFO equ 103;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data?
hInstance dd ?hWinMain dd ?dwTotalMemory dd ?dwCount dd ?ifCanQuit dd ?
.constszInfo db '无法继续申请 1MB 大小的内存!',0;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 代码段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_ProcThread proc uses ebx ecx edx esi edi,lParam local @lpLastMem
invoke GlobalAlloc,GPTR,1000000 mov @lpLastMem,eax inc dwCount add dwTotalMemory,1000000 .repeat push @lpLastMem invoke GlobalAlloc,GPTR,1000000 mov @lpLastMem,eax .if eax add dwTotalMemory,1000000 inc dwCount .endif pop eax invoke GlobalReAlloc,eax,100,GMEM_ZEROINIT sub dwTotalMemory,1000000 - 100 invoke SetDlgItemInt,hWinMain,IDC_MEMORY,dwTotalMemory,FALSE invoke SetDlgItemInt,hWinMain,IDC_COUNT,dwCount,FALSE .until ! @lpLastMem invoke SetDlgItemText,hWinMain,IDC_INFO,addr szInfo mov ifCanQuit,1 ret
_ProcThread endp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam local @dwTemp
mov eax,wMsg .if eax == WM_CLOSE .if ifCanQuit invoke EndDialog,hWnd,NULL .endif;******************************************************************** .elseif eax == WM_INITDIALOG push hWnd pop hWinMain invoke LoadIcon,hInstance,ICO_MAIN invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax invoke CreateThread,NULL,0,offset _ProcThread,NULL,/ NULL,addr @dwTemp invoke CloseHandle,eax;******************************************************************** .else mov eax,FALSE ret .endif mov eax,TRUE ret
_ProcDlgMain endp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL invoke ExitProcess,NULL;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end start