该系列案例解析按级别类别排列,如:
- [基础知识]: 类别为基础知识
- 1.2: 级别,第一个1表示属于最简单级别,后边的2仅为案例的序数(不代表难度增加(⊙o⊙)哦)
要求:获取并显示当前内存使用情况(支持4G以上内存)
演示截图:
代码及详细注释:
本帖隐藏的内容- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; by 小甲鱼, http://www.
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; MemInfo.asm
- ; 获取并显示当前内存使用情况(支持4G以上内存)
- ; 对于4G以上的内存获取,使用 GlobalMemoryStatus 会有很多问题出现
- ; 这时候我们要用 GlobalMemoryStatusEx
- ; 注意,GlobalMemoryStatusEx 需要的 MEMORYSTATUSEX 结构我们要自己定义
- ; ullTotalPhys 等成员是64位的,我们要自己定义
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; 使用 nmake 或下列命令进行编译和链接:
- ; ml /c /coff MemInfo.asm
- ; rc MemInfo.rc
- ; Link /subsystem:windows MemInfo.obj MemInfo.res
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- .386
- .model flat, stdcall
- option casemap :none
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; Include 文件定义
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- include windows.inc
- include user32.inc
- includelib user32.lib
- include kernel32.inc
- includelib kernel32.lib
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; Equ 等值定义
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ICO_MAIN equ 1000
- DLG_MAIN equ 100
- IDC_INFO equ 101
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; 数据段
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- .data?
- hInstance dd ?
- hWinMain dd ?
- .const
- szInfo db '物理内存总数 %I64d KB',0dh,0ah
- db '空闲物理内存 %I64d KB',0dh,0ah
- db '虚拟内存总数 %I64d KB',0dh,0ah
- db '空闲虚拟内存 %I64d KB',0dh,0ah
- db '已用内存比例 %d%%',0dh,0ah
- db '———————————————',0dh,0ah
- db '用户地址空间总数 %I64d KB',0dh,0ah
- db '用户可用地址空间 %I64d KB',0dh,0ah,0
-
- DWORDDWORD STRUCT
- lowDWORD DWORD ?
- highDWORD DWORD ?
- DWORDDWORD ENDS
- MEMORYSTATUSEX STRUCT
- dwLength DWORD ?
- dwMemoryLoad DWORD ?
- ullTotalPhys DWORDDWORD <>
- ullAvailPhys DWORDDWORD <>
- ullTotalPageFile DWORDDWORD <>
- ullAvailPageFile DWORDDWORD <>
- ullTotalVirtual DWORDDWORD <>
- ullAvailVirtual DWORDDWORD <>
- ullAvailExtendedVirtual DWORDDWORD <>
- MEMORYSTATUSEX ENDS
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; 代码段
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- .code
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; _Div1024这个函数干嘛呢?就是将大数除以1024,相当于右移10位
- ; 两个参数通过传址调用,酱紫省下了多余的变量
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- _Div1024 proc uses esi edi _lowDWORD:DWORD, _highDWORD:DWORD
- mov esi, _lowDWORD
- mov edi, _highDWORD
- mov eax, DWORD ptr [esi]
- mov edx, DWORD ptr [edi]
- shr eax, 10
- mov ecx, edx
- shl ecx, 22
- or eax, ecx
- mov DWORD ptr [esi], eax
- shr edx, 10
- mov DWORD ptr [edi], edx
-
- xor eax, eax
-
- ret
- _Div1024 endp
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- _GetMemInfo proc
- local @stMemInfo:MEMORYSTATUSEX ; GlobalMemoryStatusEx需要
- local @szBuffer[1024]:byte
- mov @stMemInfo.dwLength,sizeof @stMemInfo
-
- invoke GlobalMemoryStatusEx,addr @stMemInfo
-
- invoke _Div1024, addr @stMemInfo.ullTotalPhys.lowDWORD, addr @stMemInfo.ullTotalPhys.highDWORD
- invoke _Div1024, addr @stMemInfo.ullAvailPhys.lowDWORD, addr @stMemInfo.ullAvailPhys.highDWORD
- invoke _Div1024, addr @stMemInfo.ullTotalPageFile.lowDWORD, addr @stMemInfo.ullTotalPageFile.highDWORD
- invoke _Div1024, addr @stMemInfo.ullAvailPageFile.lowDWORD, addr @stMemInfo.ullAvailPageFile.highDWORD
- invoke _Div1024, addr @stMemInfo.ullTotalVirtual.lowDWORD, addr @stMemInfo.ullTotalVirtual.highDWORD
- invoke _Div1024, addr @stMemInfo.ullAvailVirtual.lowDWORD, addr @stMemInfo.ullAvailVirtual.highDWORD
-
- invoke wsprintf,addr @szBuffer,addr szInfo,\
- @stMemInfo.ullTotalPhys,@stMemInfo.ullAvailPhys,\
- @stMemInfo.ullTotalPageFile,@stMemInfo.ullAvailPageFile,\
- @stMemInfo.dwMemoryLoad,\
- @stMemInfo.ullTotalVirtual,@stMemInfo.ullAvailVirtual
-
- invoke SetDlgItemText,hWinMain,IDC_INFO,addr @szBuffer
-
- ret
- _GetMemInfo endp
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
- mov eax,wMsg
- .if eax == WM_TIMER
- call _GetMemInfo
- .elseif eax == WM_CLOSE
- invoke KillTimer,hWnd,1
- invoke EndDialog,hWnd,NULL
- ;********************************************************************
- .elseif eax == WM_INITDIALOG
- push hWnd
- pop hWinMain
- invoke LoadIcon,hInstance,ICO_MAIN
- invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
- invoke SetTimer,hWnd,1,1000,NULL
- call _GetMemInfo
- ;********************************************************************
- .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
|