分享

【新提醒】获取并显示当前内存使用情况(支持4G以上内存),Win32汇编语言案例解析,典型案例解析(VIP免费),鱼C论坛

 firefox_zyw 2014-12-01
该系列案例解析按级别类别排列,如:

  • [基础知识]: 类别为基础知识
  • 1.2: 级别,第一个1表示属于最简单级别,后边的2仅为案例的序数(不代表难度增加(⊙o⊙)哦)


要求:获取并显示当前内存使用情况(支持4G以上内存)

演示截图:


代码及详细注释:

本帖隐藏的内容

  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; by 小甲鱼, http://www.
  3. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4. ; MemInfo.asm
  5. ; 获取并显示当前内存使用情况(支持4G以上内存)
  6. ; 对于4G以上的内存获取,使用 GlobalMemoryStatus 会有很多问题出现
  7. ; 这时候我们要用 GlobalMemoryStatusEx
  8. ; 注意,GlobalMemoryStatusEx 需要的 MEMORYSTATUSEX 结构我们要自己定义
  9. ; ullTotalPhys 等成员是64位的,我们要自己定义
  10. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  11. ; 使用 nmake 或下列命令进行编译和链接:
  12. ; ml /c /coff MemInfo.asm
  13. ; rc MemInfo.rc
  14. ; Link /subsystem:windows MemInfo.obj MemInfo.res
  15. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  16.                 .386
  17.                 .model flat, stdcall
  18.                 option casemap :none
  19. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  20. ; Include 文件定义
  21. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  22. include                windows.inc
  23. include                user32.inc
  24. includelib        user32.lib
  25. include                kernel32.inc
  26. includelib        kernel32.lib
  27. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  28. ; Equ 等值定义
  29. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  30. ICO_MAIN        equ            1000
  31. DLG_MAIN        equ            100
  32. IDC_INFO        equ         101
  33. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  34. ; 数据段
  35. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  36.                 .data?

  37. hInstance        dd        ?
  38. hWinMain        dd        ?

  39.                 .const
  40. szInfo  db        '物理内存总数     %I64d KB',0dh,0ah
  41.                 db        '空闲物理内存     %I64d KB',0dh,0ah
  42.                 db        '虚拟内存总数     %I64d KB',0dh,0ah
  43.                 db        '空闲虚拟内存     %I64d KB',0dh,0ah
  44.                 db        '已用内存比例     %d%%',0dh,0ah
  45.                 db        '———————————————',0dh,0ah
  46.                 db        '用户地址空间总数 %I64d KB',0dh,0ah
  47.                 db        '用户可用地址空间 %I64d KB',0dh,0ah,0
  48.         
  49. DWORDDWORD STRUCT
  50.     lowDWORD    DWORD ?
  51.     highDWORD   DWORD ?
  52. DWORDDWORD ENDS

  53. MEMORYSTATUSEX STRUCT
  54.     dwLength           DWORD ?
  55.     dwMemoryLoad       DWORD ?
  56.     ullTotalPhys       DWORDDWORD <>
  57.     ullAvailPhys       DWORDDWORD <>
  58.     ullTotalPageFile   DWORDDWORD <>
  59.     ullAvailPageFile   DWORDDWORD <>
  60.     ullTotalVirtual    DWORDDWORD <>
  61.     ullAvailVirtual    DWORDDWORD <>
  62.     ullAvailExtendedVirtual  DWORDDWORD <>
  63. MEMORYSTATUSEX ENDS

  64. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  65. ; 代码段
  66. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  67.                 .code
  68. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  69. ; _Div1024这个函数干嘛呢?就是将大数除以1024,相当于右移10位
  70. ; 两个参数通过传址调用,酱紫省下了多余的变量
  71. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  72. _Div1024 proc   uses esi edi    _lowDWORD:DWORD, _highDWORD:DWORD
  73.         mov esi, _lowDWORD
  74.         mov edi, _highDWORD
  75.         mov eax, DWORD ptr [esi]
  76.         mov edx, DWORD ptr [edi]
  77.         shr eax, 10
  78.         mov ecx, edx
  79.         shl ecx, 22
  80.         or eax, ecx
  81.         mov DWORD ptr [esi], eax
  82.         shr edx, 10
  83.         mov DWORD ptr [edi], edx
  84.         
  85.         xor eax, eax
  86.         
  87.         ret
  88. _Div1024 endp
  89. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  90. _GetMemInfo        proc
  91.                 local        @stMemInfo:MEMORYSTATUSEX  ; GlobalMemoryStatusEx需要
  92.                 local        @szBuffer[1024]:byte

  93.                 mov        @stMemInfo.dwLength,sizeof @stMemInfo
  94.                
  95.         invoke        GlobalMemoryStatusEx,addr @stMemInfo
  96.         
  97.         invoke  _Div1024, addr @stMemInfo.ullTotalPhys.lowDWORD, addr @stMemInfo.ullTotalPhys.highDWORD
  98.         invoke  _Div1024, addr @stMemInfo.ullAvailPhys.lowDWORD, addr @stMemInfo.ullAvailPhys.highDWORD
  99.         invoke  _Div1024, addr @stMemInfo.ullTotalPageFile.lowDWORD, addr @stMemInfo.ullTotalPageFile.highDWORD
  100.         invoke  _Div1024, addr @stMemInfo.ullAvailPageFile.lowDWORD, addr @stMemInfo.ullAvailPageFile.highDWORD
  101.         invoke  _Div1024, addr @stMemInfo.ullTotalVirtual.lowDWORD, addr @stMemInfo.ullTotalVirtual.highDWORD
  102.         invoke  _Div1024, addr @stMemInfo.ullAvailVirtual.lowDWORD, addr @stMemInfo.ullAvailVirtual.highDWORD
  103.         
  104.         invoke        wsprintf,addr @szBuffer,addr szInfo,\
  105.                         @stMemInfo.ullTotalPhys,@stMemInfo.ullAvailPhys,\
  106.                         @stMemInfo.ullTotalPageFile,@stMemInfo.ullAvailPageFile,\
  107.                         @stMemInfo.dwMemoryLoad,\
  108.                         @stMemInfo.ullTotalVirtual,@stMemInfo.ullAvailVirtual
  109.                
  110.         invoke        SetDlgItemText,hWinMain,IDC_INFO,addr @szBuffer
  111.                
  112.         ret

  113. _GetMemInfo        endp
  114. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  115. _ProcDlgMain        proc        uses ebx edi esi hWnd,wMsg,wParam,lParam

  116.                 mov        eax,wMsg
  117.                 .if        eax ==        WM_TIMER
  118.                         call        _GetMemInfo
  119.                 .elseif        eax ==        WM_CLOSE
  120.                         invoke        KillTimer,hWnd,1
  121.                         invoke        EndDialog,hWnd,NULL
  122. ;********************************************************************
  123.                 .elseif        eax ==        WM_INITDIALOG
  124.                         push        hWnd
  125.                         pop        hWinMain
  126.                         invoke        LoadIcon,hInstance,ICO_MAIN
  127.                         invoke        SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
  128.                         invoke        SetTimer,hWnd,1,1000,NULL
  129.                         call        _GetMemInfo
  130. ;********************************************************************
  131.                 .else
  132.                         mov        eax,FALSE
  133.                         ret
  134.                 .endif
  135.                 mov        eax,TRUE
  136.                 ret

  137. _ProcDlgMain        endp
  138. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  139. start:
  140.                 invoke        GetModuleHandle,NULL
  141.                 mov        hInstance,eax
  142.                 invoke        DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
  143.                 invoke        ExitProcess,NULL
  144. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  145.                 end        start

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多