找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5749|回复: 3

【API】NASM编写Win32图形界面程序的方法

[复制链接]
发表于 2014-1-30 12:57:36 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
NASM汇编Win32图形界面程序
编译的方法: 1、将源码复制下来,保存到记事本,存为后缀.ASM(其实.TXT也行,只是显得不专业。) 2、使用NASM进行编译,注意要给参数“-f win32”。得到OBJ文件。 3、使用LINK进行链接。链接的时候需要用到的两个库:kernel32.libuser32.lib。 本帖的附件包含了这两个文件。也可以从VC6Lib文件夹找到。 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

ASMWGUI.7z

447.67 KB, 下载次数: 7

回复

使用道具 举报

发表于 2017-11-6 07:48:35 | 显示全部楼层
要达到华丽效果,估计太复杂了。
回复 赞! 靠!

使用道具 举报

发表于 2018-10-6 14:36:25 | 显示全部楼层
需要更多实例
回复 赞! 靠!

使用道具 举报

发表于 2020-8-13 22:00:11 | 显示全部楼层
关键是这个思路太有价值了,谢谢分享。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-4 16:33 , Processed in 0.037939 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表