第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程:

start入口地址 --> _WinMain主函数 --> 定义一些需要用的消息实体和类实体 --> 注册窗口类 --> 建立并显示窗口 --> 消息循环

( _ProcMain主要用于处理程序接受的消息 )

  1 ;模式定义
  2 ;>>>>>>>>>>>>>>>>>>>>>>>
  3 .386            ;需要的指令集 (80386)
  4 .model flat,stdcall
  5 option casemap:none
  6 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  7 ;Include 文件定义
  8 ;>>>>>>>>>>>>>>>>>>>>>>>>
  9 include windows.inc
 10 include user32.inc
 11 includelib user32.lib
 12 include kernel32.inc
 13 includelib kernel32.lib
 14
 15 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 16 ;数据段
 17 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 18     .data?            ;未初始化
 19 hInstance dd    ?    ;本程序的句柄
 20 hWinMain  dd    ?    ;本程序主窗口
 21
 22         .const
 23 szClassName    db    'MyClass',0            ;窗口名字
 24 szCaptionMain    db    'My first Window !',0    ;窗口标题栏文字
 25 szText        db    'Win32 Assembly, Simple and powerful !',0    ;窗口文字
 26
 27 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 28 ;代码段
 29 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 30     .code
 31 ;********************************************************************
 32 ; 定义窗口过程
 33 ; hWnd:窗口句柄
 34 ; uWsg:消息标识
 35 ; wParm:消息附带参数
 36 ; lParam:消息附带参数
 37 ;********************************************************************
 38 ;uses伪操作在进入时自动加上push,退出时自动加上pop,保护这些寄存器,否则程序出错
 39 _ProcWinMain    proc    uses ebx edi esi hWnd,uMsg,wParam,lParam
 40         local    @stPs:PAINTSTRUCT    ;接受绘制窗口信息
 41         local    @stRect:RECT
 42         local    @hDc
 43         mov    eax,uMsg
 44         .if    eax ==    WM_PAINT    ;可以在showwindow或者updatewindow的时候获得这个消息,从而用这个消息来自己定制窗口
 45             invoke    BeginPaint,hWnd,addr @stPs
 46             mov    @hDc,eax    ;函数是否运行成功,为NULL表示运行失败
 47             invoke    GetClientRect,hWnd,addr @stRect    ;stRect获取窗口显示文本的信息
 48             ;绘制文本
 49             invoke    DrawText,@hDc,addr szText,-1,\
 50                 addr @stRect,\
 51                 DT_SINGLELINE or DT_CENTER or DT_VCENTER
 52             invoke    EndPaint,hWnd,addr @stPs
 53         .elseif    eax ==    WM_CLOSE
 54             invoke    DestroyWindow,hWinMain    ;摧毁窗口
 55             invoke    PostQuitMessage,NULL    ;退出码(必要)
 56         .else
 57             invoke    DefWindowProc,hWnd,uMsg,wParam,lParam    ;将不感兴趣的消息交给系统处理
 58             ret
 59         .endif
 60
 61         xor eax,eax    ;清空eax为0
 62         ret            ;一般默认返回0表示处理信息成功
 63 _ProcWinMain endp
 64
 65 ;********************************************************************
 66 ; main函数
 67 ;********************************************************************
 68 _WinMain    proc
 69         local @stWndClass:WNDCLASSEX    ;定义实体stWndClass
 70         local @stMsg:MSG                ;定义消息实体
 71
 72         invoke GetModuleHandle,NULL        ;获取当前程序的句柄
 73         mov hInstance,eax                ;把获得的句柄赋值给hInstance
 74         invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;清零
 75 ;********************************************************************
 76 ; 注册窗口类
 77 ;********************************************************************
 78         invoke LoadCursor,0,IDC_ARROW    ;加载光标
 79         mov @stWndClass.hCursor,eax    ;光标
 80         push hInstance
 81         pop @stWndClass.hInstance    ;窗口类所属模块
 82         mov @stWndClass.cbSize,sizeof WNDCLASSEX    ;WNDCLASSEX大小
 83         mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW;窗口风格
 84         ;指定基于这个类建立的窗口过程地址(重要)
 85         mov @stWndClass.lpfnWndProc,offset _ProcWinMain
 86         mov    @stWndClass.hbrBackground,COLOR_WINDOW + 1    ;窗口客户区背景色
 87         mov    @stWndClass.lpszClassName,offset szClassName;要建立的类的命名
 88         invoke    RegisterClassEx,addr @stWndClass    ;注册类 stWndClass
 89 ;********************************************************************
 90 ; 建立并显示窗口
 91 ;********************************************************************
 92         invoke CreateWindowEx,        ;创建一个窗口
 93             WS_EX_CLIENTEDGE,\        ;有sunken edge 的窗口???
 94             offset szClassName,\    ;窗口类的名字
 95             offset szCaptionMain,\    ;窗口类的标题文字
 96             WS_OVERLAPPEDWINDOW,\    ;窗口的一些属性
 97             100,100,600,400,\        ;位置(x,y) 宽高(width,height)
 98             NULL,NULL,\                ;可选项
 99             hInstance,NULL;            ;句柄,参数【可选】
100         mov hWinMain,eax            ;把新建到的窗口的句柄给hWinMain
101         invoke ShowWindow,hWinMain,SW_SHOWNORMAL    ;显示窗口,正常显示
102         invoke    UpdateWindow,hWinMain                ;更新窗口的主要部分
103 ;********************************************************************
104 ; 消息循环
105 ;********************************************************************
106         .while TRUE
107             invoke GetMessage,addr @stMsg,NULL,0,0
108             .break .if eax == 0        ;如果点击了退出就结束程序
109             invoke TranslateMessage,addr @stMsg    ;进行键盘消息的转换
110             invoke DispatchMessage,addr @stMsg    ;将消息发送到对应窗口的过程处理函数中处理
111         .endw
112         ret
113 _WinMain endp
114
115 ;********************************************************************
116 ; 程序入口地址
117 ;********************************************************************
118 start:
119     call _WinMain
120     invoke ExitProcess,NULL    ;退出程序
121 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
122     end start

转载于:https://www.cnblogs.com/driedfish/p/5424203.html

【win32汇编】0x04 第一个窗口程序相关推荐

  1. 4.2第一个窗口程序

    创建Win32工程和MessageBox函数 前面讲的程序都是使用控制台界面来接受输入.显示输出的.要想使用窗口界面与用户交互必须首先创建一个Win32工程. (1)运行VC++6.0,选择菜单命令& ...

  2. Eclipse中创建第一个窗口程序

      之前在VS中用C#做程序开发时,做的最多的是Winform窗口.现在学习在Eclipse中用java编程序,也希望尽快学习如何写窗口程序,但是在选择Eclipse做开发工具的时候就听说Eclips ...

  3. Win32汇编——第一个窗口程序

    1.窗口程序的运行模式:消息驱动 2.窗口程序实现大部分功能的代码应该呆在同一个模块中--"消息处理"模块,这个模块可以随时应付所有类型的消息,只有这样才能随时响应用户的各种操作. ...

  4. 汇编实验:屏幕窗口程序(代码有较为详细的注释)

    实验3.4 屏幕窗口程序 1.题目:屏幕窗口程序 2.实验要求: 在屏幕上开出三个窗口,它们的行列坐标按照教材要求.光标首先定位在右窗口最下面一行的行首(15,50),如从键盘输入字符,则显示在右窗口 ...

  5. windows第一个窗口程序转自windows程序设计王艳平老师编著

    转 目录:   1.窗口程序  2.分析        注册窗口类别        建立窗口        显示窗口        消息循环        窗口消息处理程序    3.注意事项 窗口程 ...

  6. 使用Qt生成第一个窗口程序

    一.打开QtCreater,点击New Project 二.在Qt中,最常用的窗口程序为widgets控件程序,这里我们选择Qt Widgets Application 三.Qt生成的debug和re ...

  7. 汇编实验:屏幕窗口程序

    实验3.4  屏幕窗口程序 1.题目:屏幕窗口程序 2.实验要求: 在屏幕上开出三个窗口,它们的行列坐标按照教材要求.光标首先定位在右窗口最下面一行的行首(15,50),如从键盘输入字符,则显示在右窗 ...

  8. 使用VS创建第一个窗口程序

    我觉得C#或者说整个VS的开发环境或者功能对我最有吸引力的不是什么控制台程序,这种程序或者功能的实现使用Python等脚本语言实现起来似乎是更为便捷.对我真正有吸引力的是Windows的窗口程序. 接 ...

  9. distiller的另一个实例正忙于启动_PYQT5学习(02):利用Qt Designer制作第一个窗口程序

    目标 利用Qt Designer设计窗口界面 使用PyUIC把Qt Designer生成的UI文件转换为py文件 使用转换生成的py文件 创建项目 启动启动pycharm并创建项目 这一环节在这里就不 ...

最新文章

  1. 关于使用css3属性:transform固定菜单位置,在滑动页面时菜单闪现抖动的问题
  2. SqlServer查询语句中用到的锁
  3. TWaver With JavaFX
  4. IIS组件搭建ftp服务器
  5. vue+webpack实践
  6. android如何查看cpu的占用率和内存泄漏
  7. Kotlin中定义编译时常量
  8. SHA1hash算法C语言实现
  9. VB制作控件之图片命令按钮➀
  10. 【React入门实践】结合Ant-Design从0带你手把手开发【个人中心-信息修改】页面
  11. 学校的计算机教室火灾级别,校园火灾事故案例统计基本数据表.doc
  12. 什么是云计算数据中心互连,云计算数据中心互连是如何运作的
  13. c#之List深度复制
  14. 提升睡眠质量的助眠好物,拥有这些,不再担忧睡眠质量
  15. 数据库 | Mysql - [索引]
  16. 软件测试工程师简历项目经验怎么写?--10000个已成功入职的软件测试工程师简历范文模板(含北凡老师的真实简历)
  17. 【Matlab学习手记】csv和xlsx格式互转
  18. DFS(Depth First Search,深度优先搜索)与BFS(Breadth First Search,广度优先搜索)总结与思考
  19. Facebook 新品 Lexical, 比 Quill 更好用的 Editor ?
  20. python量化实战 顾比倒数线_外汇高手分享:顾比倒数线的画法与经典战法

热门文章

  1. jQuery插件开发的准备
  2. 网站压力测试工具 webbench
  3. oracle正则表达式
  4. python 下载或者直接读取csv文件
  5. java 虚拟机 初始化_【深入理解Java虚拟机】类的初始化过程
  6. 蓝桥杯 ALGO-159 算法训练 P0103
  7. 蓝桥杯 BASIC-11 基础练习 十六进制转十进制
  8. LeetCode344. Reverse String
  9. httpd的一些知识点
  10. JVM技术周报第1期