NASM汇编Win32图形界面程序
编译的方法:
1、将源码复制下来,保存到记事本,存为后缀.ASM(其实.TXT也行,只是显得不专业。)
2、使用NASM进行编译,注意要给参数“-f win32”。得到OBJ文件。
3、使用LINK进行链接。链接的时候需要用到的两个库:kernel32.lib和user32.lib。
本帖的附件包含了这两个文件。也可以从VC6的Lib文件夹找到。
4、链接后得到的EXE可以直接双击运行。效果和VC++编写的一样。
区别在于,汇编编写的程序非常小,只有3KB左右。
;外部函数(从Lib中引用)
extern __imp__GetModuleHandleA@4
extern __imp__LoadCursorA@8
extern __imp__RegisterClassExA@4
extern __imp__CreateWindowExA@48
extern __imp__ShowWindow@8
extern __imp__GetMessageA@16
extern __imp__TranslateMessage@4
extern __imp__DispatchMessageA@4
extern __imp__UnregisterClassA@8
extern __imp__ExitProcess@4
extern __imp__UpdateWindow@4
extern __imp__DefWindowProcA@16
extern __imp__PostQuitMessage@4
;输出函数
global _EntryPoint
global _WndProc@16 ;允许别的C/C++模块调用WndProc
;宏定义
%define WM_DESTROY 0x0002
%define IDC_ARROW 32512
%define CW_USEDEFAULT 0x80000000
%define WS_CAPTION 0x00C00000
%define WS_SYSMENU 0x00080000
%define WS_THICKFRAME 0x00040000
%define WS_MINIMIZEBOX 0x00020000
%define WS_MAXIMIZEBOX 0x00010000
%define WS_VISIBLE 0x10000000
%define WS_OVERLAPPEDWINDOW WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX
%define SW_SHOWNORMAL 1
;代码段
[section .text]
;---===***###<<<入口点>>>###***===---
_EntryPoint:
;获取hInstance
push 0
call [__imp__GetModuleHandleA@4]
mov [wcex.hInstance],eax
;填写WNDCLASSEX
push IDC_ARROW
push 0
call [__imp__LoadCursorA@8]
mov [wcex.hCursor],eax
;注册窗口类
push wcex
call [__imp__RegisterClassExA@4]
;创建窗口
push 0 ;lpParam
push dword[wcex.hInstance] ;hInstance
push 0 ;hMenu
push 0 ;hWndParent
push 666 ;Height
push 888 ;Width
push CW_USEDEFAULT ;Y
push CW_USEDEFAULT ;X
push WS_OVERLAPPEDWINDOW ;dwStyle
push szWindowName ;lpWindowName
push szClassName ;lpClassName
push 0 ;dwExStyle
call [__imp__CreateWindowExA@48]
mov [hWnd],eax
;显示窗口
push SW_SHOWNORMAL
push eax
call [__imp__ShowWindow@8]
;刷新窗口
push dword [hWnd]
call [__imp__UpdateWindow@4]
;消息循环
.msgloop:
push 0
push 0
push 0
push msg
call [__imp__GetMessageA@16]
or eax,eax
jz .loopout
push msg
call [__imp__TranslateMessage@4]
push msg
call [__imp__DispatchMessageA@4]
jmp .msgloop
.loopout:
;取消注册
push dword [wcex.hInstance]
push szClassName
call [__imp__UnregisterClassA@8]
;退出程序
push 0
call [__imp__ExitProcess@4]
ret
;WndProc消息处理函数
_WndProc@16:
push ebp
mov ebp,esp
.destroy:
cmp dword[ebp+12],WM_DESTROY;处理WM_DESTROY
jnz .default
push 0
call [__imp__PostQuitMessage@4];PostQuitMessage(0);
xor eax,eax ;返回0
pop ebp
ret 16
.default: ;其它消息
pop ebp
jmp [__imp__DefWindowProcA@16];return DefWindowProc(hWnd,Msg,wParam,lParam);
;数据段
[section .data]
szClassName db "CLASS_HELLO",0
szWindowName db "Hello world!",0
wcex: ;WNDCLASSEX结构
.cbSize dd 48
.style dd 0
.lpfnWndProc dd _WndProc@16
.cbClsExtra dd 0
.cbWndExtra dd 0
.hInstance dd 0
.hIcon dd 0
.hCursor dd 0
.hbrBackground dd 6
.lpszMenuName dd 0
.lpszClassName dd szClassName
.hIconSm dd 0
;自动分配段
[section .bss]
hWnd resd 1
msg:
.hwnd resd 1
.message resd 1
.wParam resd 1
.lParam resd 1
.time resd 1
.ptx resd 1
.pty resd 1
|