博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编 Hello Window [菜鸟]疑问
阅读量:4565 次
发布时间:2019-06-08

本文共 5124 字,大约阅读时间需要 17 分钟。

 

Hello Window
1 .386   2 .model flat,stdcall   3 option casemap:none   4   5 include user32.inc   6 includelib user32.lib   7 includelib kernel32.lib   8 include kernel32.inc   9 include gdi32.inc  10 includelib gdi32.lib  11 include windows.inc  12  13  14 .data  15 _swTitle    db "测试标题",0  16 _swContent    db "hello Window",0  17 _className    db "MyClass",0  18  19 _btntzt        db "button",0  20 _szbutton    db "&OK",0  21 .data?  22 _hInstance    dd ?  23 _hWinMan    dd ?  24 .const  25  26 szText        db    'Win32 Assembly, Simple and powerful !',0  27  28 .code  29  30  31  32  33 ;消息过程  34 _ProcMain    proc uses ebx edi esi        hWnd,uMsg,wParam,lParam  35  36  37  38 ;--------------------------------------------------------------------------------  39  40             ;mov    eax,uMsg  41             ;.if    eax==WM_CLOSE  42                 ;invoke MessageBox,NULL,offset _swTitle,offset _swContent,MB_OK  43             ;    ret  44             ;.else  45             ;    invoke DefWindowProc,NULL,uMsg,wParam,lParam  46             ;    ret  47             ;.endif  48             ;ret  49 ;--------------------------------------------------------------------------------  50  51                     local    @stPs:PAINTSTRUCT  52         local    @stRect:RECT  53         local    @hDc  54  55         mov    eax,uMsg  56 ;********************************************************************  57         .if    eax ==    WM_PAINT  58             invoke    BeginPaint,hWnd,addr @stPs  59             mov    @hDc,eax  60  61             invoke    GetClientRect,hWnd,addr @stRect  62             invoke    DrawText,@hDc,addr szText,-1,\  63                 addr @stRect,\  64                 DT_SINGLELINE or DT_CENTER or DT_VCENTER  65  66             invoke    EndPaint,hWnd,addr @stPs  67 ;********************************************************************  68         .elseif    eax ==    WM_CLOSE  69             invoke    DestroyWindow,_hWinMan  70             invoke    PostQuitMessage,NULL  71         .elseif    eax ==     WM_CREATE  72             invoke CreateWindowEx,NULL,offset _btntzt,offset _szbutton,WS_CHILD or WS_VISIBLE,10,10,65,22,hWnd,1,_hInstance,lParam  73 ;********************************************************************  74         .else  75             invoke    DefWindowProc,hWnd,uMsg,wParam,lParam  76             ret  77         .endif  78 ;********************************************************************  79         xor    eax,eax  80         ret  81  82     ret  83 _ProcMain    endp  84 ;后缀EX扩展的意思。代码书写格式为易读性 st结构 h模块 _全局 @局部  85 _Win32Main    proc  86     LOCAL @stWNDClass:WNDCLASSEX  87     LOCAL @stMSG:MSG  88      89     invoke GetModuleHandle,NULL  90     mov _hInstance,eax  91     ;初始化  92     invoke RtlZeroMemory,addr @stWNDClass,sizeof @stWNDClass  93      94     invoke LoadCursor,0,IDC_ARROW ;获取鼠标模块  95     ;结构  96     mov @stWNDClass.hCursor,eax  97         ;    push    _hInstance;1  98         ;pop    @stWNDClass.hInstance;1  99         100     mov @stWNDClass.hInstance,offset _hInstance;2   上面的1 和这里的2 有什么不同 这两句为什么实现的不是一个效果 有什么不同? 101     mov @stWNDClass.cbSize,sizeof WNDCLASSEX 102     mov @stWNDClass.hbrBackground,COLOR_WINDOW 103     mov @stWNDClass.lpszClassName,offset _className 104     mov @stWNDClass.lpfnWndProc,offset _ProcMain 105     mov @stWNDClass.style,CS_HREDRAW or CS_VREDRAW 106 107     invoke RegisterClassEx,addr @stWNDClass 108     109     ;创建窗口 110     invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset _className,offset _swTitle,WS_OVERLAPPEDWINDOW,\ 111                         100,100,444,555,\ 112                         NULL,NULL,_hInstance,NULL 113     mov _hWinMan,eax 114     ;显示窗口 115     invoke ShowWindow,_hWinMan,SW_SHOWNORMAL 116     ;刷新绘制 发送WM_PAINT消息 117     invoke UpdateWindow,_hWinMan 118     ;消息循环 119     ;GetMessage 如果取得的MSG是WM_QUIT  EAX就等于0,否则非零 120     ;PeekMessage 有消息返回非零,否则直接返回EAX等于0 121     .while    TRUE 122         123             invoke GetMessage,addr @stMSG,NULL,0,0 124             .break    .if eax==0 125             invoke TranslateMessage,addr @stMSG 126             invoke DispatchMessage,addr @stMSG 127             128             129 ;-------------------------------------------------------------------------------- 130             131             ;invoke PeekMessage,addr @stMSG,NULL,0,0,PM_REMOVE 132            ;.if eax==0 有消息才去处理,所以这里应该是 .if eax 非空 133             ;    .break    .if    @stMSG.message==WM_QUIT 134             ;    invoke TranslateMessage,addr @stMSG 135             ;    invoke DispatchMessage,addr @stMSG 136             ;.else 137                 ;code 138 ;-------------------------------------------------------------------------------- 139             ;.endif 140             141     .endw 142             143     ret 144     145 146 _Win32Main endp 147 148 149 start: 150     Call _Win32Main 151     invoke ExitProcess,NULL 152 end start

诚心学习。希望在学习的道路上,得到点指点。

1.peekmessage 我这样写和getMessage 功能上没什么差别呀。为什么就不行?

2.在消息过程里面,为什么一定要处理WM_PAINT?在注册WINDOW后,不是已经创建了一个444 555 大小的窗口嘛?

转载于:https://www.cnblogs.com/yueyue184/archive/2011/12/01/2270246.html

你可能感兴趣的文章
BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)
查看>>
[osg]osg窗口显示和单屏幕显示
查看>>
前端技术在线文档地址链接
查看>>
077_打印各种时间格式
查看>>
[LeetCode] 101. Symmetric Tree_ Easy tag: BFS
查看>>
前端基础之html
查看>>
.Net基础之3——运算符
查看>>
scrapy管道MySQL简记
查看>>
使用 jQuery Deferred 和 Promise 创建响应式应用程序
查看>>
Bzoj1013--Jsoi2008球形空间产生器
查看>>
报文格式【定长报文】
查看>>
RDLC报表钻取空白页问题
查看>>
OS X升级到10.10之后使用pod出现问题的解决方法
查看>>
多路电梯调度的思想
查看>>
jQuery-对Select的操作
查看>>
过滤器、监听器、拦截器的区别
查看>>
为什么要进行需求分析?通常对软件系统有哪些需求?
查看>>
Oracle RAC环境下ASM磁盘组扩容
查看>>
添加web引用和添加服务引用有什么区别?
查看>>
一些模板
查看>>