小弟刚接触asm, 对fasm比较倾向。。 写程序时候遇到问题。 因为fasm没有RtlZeroMemory等。所以小弟采用lea 指令来获取局部变量的地址。这是一个窗口的程序,但是无奈,编译是通过的。窗口不显示,大致觉得肯定是那里获取地址错误了。无奈,fasm相关的资料甚少。找了下fasm自带的窗口例子,都是直接声明的全局变量。没有局部变量的相关例子,没办法,来看雪请教下,不知道是否有志同道合的朋友,帮忙解决下问题。。
小弟在此谢谢了。。
format PE GUI 4.0
include '%include%\win32a.inc'
include '%include%\MY_MACRO.INC'
entry _start
section '.data' data readable writeable
hInstance rd 1
hWinMain rd 1
szClassName db 'Fasm Windows Proc', 0
szWndName db '第一个程序', 0
; import section
section '.import' import data readable writeable
library kernel32, 'KERNEL32.DLL',\
user32, 'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
; code section
section '.code' code readable executable
;*******************************************************************
;窗口过程函数
;*******************************************************************
proc _ProcWinMan, hwnd, wmsg, wparam, lparam
push ebx esi edi ; 保存指针寄存器
cmp [wmsg], WM_DESTROY
je .wmdestroy
.defwndproc:
callw DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
jmp .finish
.wmdestroy:
callw PostQuitMessage,0
xor eax, eax
.finish:
pop ebx esi edi
ret
endp
proc _WinMain
local @stWndClass : WNDCLASSEX
local @stMsg : MSG
callw GetModuleHandle, NULL
mov [hInstance], eax
lea edi,[@stWndClass]
mov ecx, sizeof.WNDCLASSEX/4
xor eax,eax
rep stosd
;******************************************************************
;注册窗口类
;******************************************************************
;第一个参数则表示图标的模块句柄,NULL则表示使用windows提供标准的图标
callw LoadIcon, NULL, IDI_WINLOGO
mov [@stWndClass.hIcon], eax
push hInstance
pop [@stWndClass.hInstance]
callw LoadCursor, NULL, IDC_ARROW
mov [@stWndClass.hCursor], eax
mov [@stWndClass.cbSize], sizeof.WNDCLASSEX
mov [@stWndClass.style], CS_HREDRAW or CS_VREDRAW
mov [@stWndClass.lpfnWndProc], _ProcWinMan
mov [@stWndClass.lpszClassName], szClassName
mov [@stWndClass.hbrBackground], COLOR_WINDOW+1
lea ebx, [@stWndClass]
callw RegisterClassEx, ebx
;******************************************************************
;建立并显示窗口
;******************************************************************
callw CreateWindowEx, WS_EX_PALETTEWINDOW, szClassName, szWndName,\
WS_OVERLAPPEDWINDOW,\
100, 100, 600, 400,\
NULL, NULL, hInstance, NULL
mov [hWinMain], eax
callw ShowWindow, [hWinMain], SW_SHOWNORMAL
callw UpdateWindow, [hWinMain]
;********************************************************************
;消息循环
;**********************************************************************
msg_loop:
lea ebx, [@stMsg]
callw GetMessage, ebx, NULL, 0, 0
or eax, eax ;or做或运算。如果ZF标志位为1,则跳转之标号
je end_loop ;如果zf标志位为1,退出程序。因为这表示发送的是WM_QUIT消息
callw TranslateMessage, ebx
callw DispatchMessage, ebx
jmp msg_loop
end_loop:
callw ExitProcess, 0
ret
endp
_start:
call _WinMain
callw ExitProcess, NULL
已经解决,版主结贴吧。。。 粗心造成的问题。。 主要是lea获取地址太郁闷。哎 回去封装个宏。。。。。。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!