当前位置: 首页 > news >正文

Win32汇编学习笔记(二)

模仿win32Hello,World程序:

None.gif         . 386
None.gif        .model flat,stdcall
None.gif        option 
casemap: none
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
 Include 文件定义
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
include        windows. inc
None.gifinclude        gdi32.
inc
None.gifincludelib    gdi32.lib
None.gifinclude        user32.
inc
None.gifincludelib    user32.lib
None.gifinclude        kernel32.
inc
None.gifincludelib    kernel32.lib
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
 数据段
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
        .data?
None.gifhInstance    dd        ?        
; 应用程序句柄
None.gif
hWinMain    dd        ?         ; 窗口句柄
None.gif

None.gif        .const
None.gifszClassName    db    
' MyClass ' , 0          ; 窗口类名称
None.gif
szCaptionMain    db     ' My first Window ! ' , 0          ; 窗口标题
None.gif
szText        db     '  Hello,Win32 Assembly!! ' , 0          ; 要显示的信息
None.gif
szButton     db     ' button ' , 0
None.gifszButtonText    db    
' 点我吧!! ' , 0
None.gifszMsgTitle db 
' 信息 ' , 0
None.gifszErrorMsg db 
' 出错啦!! ' , 0
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
 代码段
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
        .code
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
 出错处理过程
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
_ErrorProc proc    
None.gif        invoke MessageBox,NULL,offset szErrorMsg,offset szMsgTitle,MB_OK
None.gif        
ret
None.gif_ErrorProc endp
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
 窗口过程
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
_ProcWinMain    proc    uses ebx edi esi hWnd,uMsg,wParam,lParam             ; 让汇编器保持子程序中使用到的寄存器的正确性 
None.gif
        local     @stPs: PAINTSTRUCT            
None.gif        local    
@stRect: RECT
None.gif        local    @hDc            
None.gif
None.gif        
mov     eax,uMsg
None.gif
; ********************************************************************
None.gif
        .if eax == WM_CREATE
None.gif            invoke CreateWindowEx,NULL,offset szButton,offset szButtonText,\
None.gif                            WS_CHILD 
or  WS_VISIBLE, 100 , 100 , 65 , 50 ,hWnd, 1 ,hInstance,NULL
None.gif
; ********************************************************************
None.gif
        .elseif    eax ==    WM_PAINT
None.gif            invoke    BeginPaint,hWnd,addr @stPs
None.gif            
mov     @hDc,eax
None.gif
None.gif            invoke    GetClientRect,hWnd,addr @stRect
None.gif            invoke    DrawText,@hDc,addr szText,-
1 ,\      ; 长度设置为-1,表示输出的字符串以'\0'结尾,且由函数自动计算出其长度
None.gif
                addr @stRect,\
None.gif                DT_SINGLELINE 
or  DT_CENTER  or  DT_VCENTER
None.gif
None.gif            invoke    EndPaint,hWnd,addr @stPs
None.gif
; ********************************************************************
None.gif
        .elseif eax == WM_COMMAND
None.gif            invoke    MessageBox,NULL,offset szText,offset szMsgTitle,MB_OK
None.gif
; ********************************************************************
None.gif
        .elseif    eax ==    WM_CLOSE
None.gif            invoke    DestroyWindow,hWinMain
None.gif            invoke    PostQuitMessage,NULL
None.gif
; ********************************************************************
None.gif
        .else
None.gif            invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
None.gif            
ret
None.gif        .endif
None.gif
; ********************************************************************
None.gif
         xor     eax,eax             ; eax寄存器清零
None.gif
         ret
None.gif
None.gif_ProcWinMain    endp
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
WinMain函数
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif

None.gif_WinMain    proc
None.gif        local    
@stWndClass: WNDCLASSEX
None.gif        local    
@stMsg: MSG
None.gif        
None.gif        invoke    GetModuleHandle,NULL   
; 获取应用程序句柄,这在VC里是通过操作系统传递进来的,但是汇编中需要自己去获取
None.gif
         mov     hInstance,eax             ; 获取到的应用程序句柄在eax中
None.gif
        invoke    RtlZeroMemory,addr @stWndClass,sizeof @stWndClass   ; 清零
None.gif;
********************************************************************
None.gif;
 注册窗口类
None.gif;
********************************************************************
None.gif
        invoke    LoadCursor, 0 ,IDC_ARROW     ; 加载光标
None.gif
         mov     @stWndClass.hCursor,eax            
None.gif        
push     hInstance
None.gif        
pop     @stWndClass.hInstance
None.gif        
mov     @stWndClass.cbSize,sizeof WNDCLASSEX
None.gif        
mov     @stWndClass.style,CS_HREDRAW  or  CS_VREDRAW
None.gif
None.gif        
mov     @stWndClass.lpfnWndProc,offset _ProcWinMain         ; 设置窗口处理函数
None.gif
         ; invoke GetStockObject,WHITE_BRUSH
None.gif
         ; mov @stWndClass.hbrBackground,eax
None.gif
         mov     @stWndClass.hbrBackground,COLOR_WINDOW +  1
None.gif        
mov     @stWndClass.lpszClassName,offset szClassName
None.gif        invoke    RegisterClassEx,addr @stWndClass            
; 注册窗口类
None.gif;
********************************************************************
None.gif;
 建立并显示窗口
None.gif;
********************************************************************
None.gif
        invoke    CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
None.gif            WS_OVERLAPPEDWINDOW,\
None.gif            
100 , 100 , 600 , 400 ,\
None.gif            NULL,NULL,hInstance,NULL                    
; 创建窗口,发出一个WM_CREATE消息
None.gif
         mov     hWinMain,eax                         ; 保存窗口句柄
None.gif
        invoke    ShowWindow,hWinMain,SW_SHOWNORMAL                 ; 显示窗口
None.gif
        invoke    UpdateWindow,hWinMain                                         ; 发出一个WM_PAINT消息
None.gif;
********************************************************************
None.gif;
 第一种消息循环,使用GetMessage,同步的
None.gif;
********************************************************************
None.gif
         ; .while    TRUE
None.gif
             ; invoke    GetMessage,addr @stMsg,NULL,0,0
None.gif
             ; .break    .if eax    == 0                    ;stMsg为0,即收到WM_QUIT消息时退出
None.gif
             ; invoke    TranslateMessage,addr @stMsg
None.gif
             ; invoke    DispatchMessage,addr @stMsg
None.gif
         ; .endw
None.gif;
********************************************************************
None.gif;
另一种消息循环,使用PeekMessage,异步的
None.gif;
********************************************************************
None.gif
        .while TRUE
None.gif            invoke PeekMessage,addr @stMsg,NULL,
0 , 0 ,PM_REMOVE
None.gif            .if eax != 
0
None.gif                    .break  .if @stMsg.message == WM_QUIT
None.gif                    invoke    TranslateMessage,addr @stMsg
None.gif                    invoke    DispatchMessage,addr @stMsg 
None.gif            .else
None.gif                    
; 空闲时间,可以做其他处理工作
None.gif
            .endif
None.gif        .endw
None.gif        
ret
None.gif_WinMain endp
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
程序入口点
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
start:
None.gif        
call     _WinMain    
None.gif        invoke    ExitProcess,NULL
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
        end    start
None.gif
None.gif
None.gif

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

运行结果:


2008030702.jpg

相关文章:

  • 重新回归
  • 企业信息化:Web2.0带来的启示
  • 综合布线图书大全
  • MVP峰会,园子里有谁要去西雅图的,进来给点意见(请dudu留首页)
  • 获得库每个表的记录数和容量,sp_msforeachtable是MS未公开的存储过程
  • 狂笑不止
  • 教你如何进入内网
  • C语言程序设计 C语言吧问题资料大全
  • JCreator 使用技巧-3
  • 励志格言17条
  • 企业***网的规划及组建
  • Struts2+Spring2+Hibernate3 web应用示例(四)
  • 评论:人才流失强力折射出现实畸形人才观
  • Centos yum 安装NTOP
  • 2008年5月软考全部试题已经公布 答案正在陆续更新中
  • __proto__ 和 prototype的关系
  • HTML5新特性总结
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java超时控制的实现
  • Java面向对象及其三大特征
  • leetcode386. Lexicographical Numbers
  • Material Design
  • node 版本过低
  • Python_OOP
  • scala基础语法(二)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Shadow DOM 内部构造及如何构建独立组件
  • socket.io+express实现聊天室的思考(三)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 免费小说阅读小程序
  • 前端性能优化——回流与重绘
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 运行时添加log4j2的appender
  • UI设计初学者应该如何入门?
  • 带你开发类似Pokemon Go的AR游戏
  • #pragam once 和 #ifndef 预编译头
  • #pragma pack(1)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (12)目标检测_SSD基于pytorch搭建代码
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Python) SOAP Web Service (HTTP POST)
  • (SpringBoot)第二章:Spring创建和使用
  • (第一天)包装对象、作用域、创建对象
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (未解决)macOS matplotlib 中文是方框
  • (五)Python 垃圾回收机制
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .form文件_一篇文章学会文件上传
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @DateTimeFormat 和 @JsonFormat 注解详解