吼吼,总算进入内存和文件的章节了,,虽然略过了GDI和通用对话框等等的学习。。
本章第一个练手的程序:
.asm文件:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include gdi32.inc
includelib kernel32.lib
includelib user32.lib
includelib gdi32.lib
IDD_DIALOG1 equ 100
IDC_STATIC equ 101
TIMER1 equ 1
.data
.data?
hInstance dd ?
hWinMain dd ?
.const
szFormat db ’物理内存总数 %lu 字节’,0dh,0ah
db ’可用物理内存 %lu 字节’,0dh,0ah
db ’交换文件总大小 %lu 字节’,0dh,0ah
db ’空闲交换文件大小 %lu 字节’,0dh,0ah
db ’用户可用地址空间 %lu 字节’,0dh,0ah
db ’当前空闲地址空间 %lu 字节’,0dh,0ah,0
.code
_ShowMemory proc
local @stMemoryStatus:MEMORYSTATUS
local @szBuffer[1024]:byte
;pushad
mov @stMemoryStatus.dwLength,sizeof @stMemoryStatus
invoke GlobalMemoryStatus,addr @stMemoryStatus
invoke wsprintf,addr @szBuffer,addr szFormat,
@stMemoryStatus.dwTotalPhys,
@stMemoryStatus.dwAvailPhys,
@stMemoryStatus.dwTotalPageFile,
@stMemoryStatus.dwAvailPageFile,
@stMemoryStatus.dwTotalVirtual,
@stMemoryStatus.dwAvailVirtual
invoke SetDlgItemText,hWinMain,IDC_STATIC,addr @szBuffer
;popad
ret
_ShowMemory endp
_ProcDlgMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if eax==WM_TIMER
call _ShowMemory
.elseif eax==WM_INITDIALOG
push hWnd
pop hWinMain
invoke SetTimer,hWnd,TIMER1,1000,0
call _ShowMemory
.elseif eax==WM_CLOSE
invoke KillTimer,hWnd,TIMER1
invoke EndDialog,hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
rc文件较简单,此处略去。。
第一次nmake的时候出现instruction or register not accept in current CPU mode的奇怪错误,百思不得其解,将代码复制到新文件后编译就通过了,,,