汇编语言学习笔记-创建最基本的windows窗体
1
如果你不熟悉开发环境的搭建请看此文:
http://www.cnblogs.com/liulun/archive/2009/12/26/1632985.html
2
如果你看了此文的所有注释仍看不懂,请暂且不要再看本系列的其他文章了,先学学WINDOWS API的相关知识吧
3
以上代码摘自一个汇编语言全接触的CHM 是一个名叫Lxx的前辈翻译的
4
希望得到大家的支持
.386 .model flat,stdcall;内存平坦,参数传递约定 option casemap:none;大小写敏感 ;;;;;;引用一些必要的数据 include D:\masm32\include\windows.inc include D:\masm32\include\user32.inc includelib D:\masm32\lib\user32.lib include D:\masm32\include\kernel32.inc includelib D:\masm32\lib\kernel32.lib WinMain proto : DWORD ,: DWORD ,: DWORD ,: DWORD ;函数声明,将在后面进行函数的定义 ;;;;;;已定义数据的数据段 .DATA ClassName db "SimpleWinClass" ,0 AppName db "Our First Window" ,0 OurText db "hello world" ,0 ;;;;;;未定义数据的数据段 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? ;;;;;;代码段 .CODE start: ;程序的入口与end start对应 invoke GetModuleHandle,NULL;调用API函数获取应用程序句柄并把句柄存入eax寄存器 mov hInstance,eax invoke GetCommandLine;获取命令行的字符串指针 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 LOCAL hwnd: HWND ;初始化窗口类,这个窗口类描述我们的窗口长的什么样子 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,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL 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 CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL;创建窗体 mov hwnd,eax;保存窗口句柄 invoke ShowWindow,hwnd,CmdShow;显示窗口 invoke UpdateWindow,hwnd;刷新窗口 ;开始消息循环 .WHILE TRUE invoke GetMessage,ADDR msg,NULL,0,0;获取消息队列中的消息 .BREAK .IF (!eax);如果获取的消息为WM_QUIT就退出消息循环 invoke TranslateMessage,ADDR msg;按键消息的转义 invoke DispatchMessage,ADDR msg;把消息发送到负责消息处理的函数,回调方法 .ENDW mov eax,msg.wParam;把退出的消息代码码放到EAX里然后回到主函数 ret WinMain endp WndProc proc hWnd: HWND ,uMsg: UINT ,wParam: WPARAM ,lParam: LPARAM ;消息处理函数,此函数可以随便命名 .IF uMsg == WM_DESTROY;销毁窗口的消息 invoke PostQuitMessage,NULL .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam;默认的消息处理函数 ret;退出此子程序 .ENDIF xor eax,eax;eax置零 ret WndProc endp end start |
分类:
汇编语言学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2009-01-05 全文索引