一个masm32的小问题

athlor 2008-03-03 01:15:39
一个获取内存大小的小程序,源程序是以byte显示内存信息的,想改为以MB显示.请问改如何修改.
比如这项
db '物理内存总数 %lu 字节',0dh,0ah
(虽然知道该连除两个1024,但不知道该加在什么地方, @stMemInfo.dwTotalPhys改为@stMemInfo.dwTotalPhys/1024/1024 编译时会出错)

源码如下:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 '物理内存总数 %lu 字节',0dh,0ah
db '空闲物理内存 %lu 字节',0dh,0ah
db '虚拟内存总数 %lu 字节',0dh,0ah
db '空闲虚拟内存 %lu 字节',0dh,0ah
db '已用内存比例 %d%%',0dh,0ah
db '————————————————',0dh,0ah
db '用户地址空间总数 %lu 字节',0dh,0ah
db '用户可用地址空间 %lu 字节',0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetMemInfo proc
local @stMemInfo:MEMORYSTATUS
local @szBuffer[1024]:byte

mov @stMemInfo.dwLength,sizeof @stMemInfo
invoke GlobalMemoryStatus,addr @stMemInfo
invoke wsprintf,addr @szBuffer,addr szInfo,\
@stMemInfo.dwTotalPhys,@stMemInfo.dwAvailPhys,\
@stMemInfo.dwTotalPageFile,@stMemInfo.dwAvailPageFile,\
@stMemInfo.dwMemoryLoad,\
@stMemInfo.dwTotalVirtual,@stMemInfo.dwAvailVirtual
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









szInfo db '物理内存总数 %lu 字节',0dh,0ah
db '空闲物理内存 %lu 字节',0dh,0ah
db '虚拟内存总数 %lu 字节',0dh,0ah
db '空闲虚拟内存 %lu 字节',0dh,0ah
db '已用内存比例 %d%%',0dh,0ah
db '————————————————',0dh,0ah
db '用户地址空间总数 %lu 字节',0dh,0ah
db '用户可用地址空间 %lu 字节',0dh,0ah,0

...全文
98 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pig4210 2008-03-03
  • 打赏
  • 举报
回复
都已经说得很明白了嘛。
invoke GlobalMemoryStatus,addr @stMemInfo
mov ecx,@stMemInfo.dwTotalPhys
shr ecx,20
invoke wsprintf,addr @szBuffer,addr szInfo,\
ecx,@stMemInfo.dwAvailPhys,\ ;这不就行了嘛
@stMemInfo.dwTotalPageFile,@stMemInfo.dwAvailPageFile,\
@stMemInfo.dwMemoryLoad,\
@stMemInfo.dwTotalVirtual,@stMemInfo.dwAvailVirtual
invoke SetDlgItemText,hWinMain,IDC_INFO,addr @szBuffer

zara 2008-03-03
  • 打赏
  • 举报
回复
用除法啊, 还不如通过右移 20 位来实现简单. 就是加在获取了内存信息之后, wsprintf() 函数转换为显示的字符串之前
athlor 2008-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mydo 的回复:]
byte / ( 1024 * 1024 )
[/Quote]

具体添加在哪里?
大熊猫侯佩 2008-03-03
  • 打赏
  • 举报
回复
byte / ( 1024 * 1024 )
cnzdgs 2008-03-03
  • 打赏
  • 举报
回复
_GetMemInfo proc 
local @stMemInfo:MEMORYSTATUS
local @szBuffer[1024]:byte

mov @stMemInfo.dwLength,sizeof @stMemInfo
invoke GlobalMemoryStatus,addr @stMemInfo
mov cl, 20
mov eax, @stMemInfo.dwAvailVirtual
shr eax, cl
push eax
mov eax, @stMemInfo.dwTotalVirtual
shr eax, cl
push eax
mov eax, @stMemInfo.dwMemoryLoad
shr eax, cl
push eax
mov eax, @stMemInfo.dwAvailPageFile
shr eax, cl
push eax
mov eax, @stMemInfo.dwTotalPageFile
shr eax, cl
push eax
mov eax, @stMemInfo.dwAvailPhys
shr eax, cl
push eax
mov eax, @stMemInfo.dwTotalPhys
shr eax, cl
push eax
push addr szInfo
push addr @szBuffer
call wsprintf
add esp, 9*4
invoke SetDlgItemText,hWinMain,IDC_INFO,addr @szBuffer
ret

_GetMemInfo endp
相关推荐
发帖
汇编语言

2.1w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
帖子事件
创建了帖子
2008-03-03 01:15
社区公告
暂无公告