Всем привет! Пишу программу мониторинга памяти на ассемблере под win32.
возникло несколько проблем, 1) размеры связанные с файлом подкачки выводятся как отрицательные числа; 2)с помощью таймера пытаюсь каждую секунду обновлять static'и в диалоговом окне , но получается какая то белеберда - некоторые static'и пропадают, другие обновляются с большой скоростью.
Код:
.386
.model flat,stdcall
option casemap:none
include 4.inc
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
invoke InitCommonControls
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszClassName,offset ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateDialogParam,hInstance,IDD_DIALOG,NULL,addr WndProc,NULL
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
invoke SetTimer,hWnd,timer,1000,NULL
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.BREAK .if !eax
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw
mov eax,msg.wParam
invoke KillTimer,hWnd,timer
ret
WinMain endp
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL ps:PAINTSTRUCT
mov eax,uMsg
.if eax==WM_INITDIALOG
push hWin
pop hWnd
invoke print,hWin,uMsg,wParam,lParam
.elseif eax==WM_COMMAND
;mov eax,wParam
;and eax,0FFFFh
.elseif eax==WM_TIMER
.if wParam==timer
invoke InvalidateRect, hWin,NULL,TRUE
.endif
.elseif eax==WM_PAINT
invoke BeginPaint,hWin, ADDR ps
call info
invoke print,hWin,uMsg,wParam,lParam
invoke EndPaint,hWin, ADDR ps
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWin
.elseif uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
reform proc
mov text,ebx
invoke wsprintf,addr text, addr t, ebx
mov ecx,15
lea edi,text
cycle:
mov bl,[edi]
mov [esi],bl
inc edi
inc esi
loop cycle
ret
reform endp
info proc
invoke GlobalMemoryStatus,addr mem
mov ebx,mem.dwMemoryLoad
lea esi,msg1
call reform
mov ebx,mem.dwTotalPhys
lea esi,msg2
call reform
mov ebx,mem.dwAvailPhys
lea esi,msg3
call reform
mov ebx,mem.dwTotalPageFile
lea esi,msg4
call reform
mov ebx,mem.dwAvailPageFile
lea esi,msg5
call reform
mov ebx,mem.dwTotalVirtual
lea esi,msg6
call reform
mov ebx,mem.dwAvailVirtual
lea esi,msg7
call reform
ret
info endp
print proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
call info
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest1,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,185,9,160,20,hWin,static1,hInstance,NULL
mov hwndstatic1,eax
invoke SetWindowText,hwndstatic1,ADDR msg1
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest2,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,185,39,160,20,hWin,static2,hInstance,NULL
mov hwndstatic2,eax
invoke SetWindowText,hwndstatic2,ADDR msg2
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest3,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,185,69,160,20,hWin,static3,hInstance,NULL
mov hwndstatic3,eax
invoke SetWindowText,hwndstatic3,ADDR msg3
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest4,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,185,99,160,20,hWin,static4,hInstance,NULL
mov hwndstatic4,eax
invoke SetWindowText,hwndstatic4,ADDR msg4
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest5,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,185,129,160,20,hWin,static5,hInstance,NULL
mov hwndstatic5,eax
invoke SetWindowText,hwndstatic5,ADDR msg5
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest6,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,185,159,160,20,hWin,static6,hInstance,NULL
mov hwndstatic6,eax
invoke SetWindowText,hwndstatic6,ADDR msg6
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest7,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,185,189,160,20,hWin,static7,hInstance,NULL
mov hwndstatic7,eax
invoke SetWindowText,hwndstatic7,ADDR msg7
ret
print endp
end start