首页 > 编程语言 >我的第一个win32汇编程序

我的第一个win32汇编程序

时间:2023-04-03 17:38:04浏览次数:36  
标签:窗口 第一个 invoke 汇编程序 mov win32 eax stWndClass addr

.386

 .Model Flat,stdcall

 option  casemap:none

 ;头文件包含

 include windows.inc

 include kernel32.inc

 includelib kernel32.lib

 include user32.inc

 includelib user32.lib

 include gdi32.inc

 includelib gdi32.lib

 ;数据段定义

 .data

 hInstance dd ?

 hWinMain  dd ?

 ;常量定义

 .const

 szClassName db "MyClass",0

 szCaption   db "My FirstWindow",0

 szText      db "这是我的第二个程序",0

 szButton    db "Button",0;

 szButtonText db "ButtonText",0

 ;代码段定义

 .code

 WinProc proc uses ebx edi esi,hWnd,uMsg,wParam,lParam

 ;局部变量的定义

 local @stPs:PAINTSTRUCT

 local @stRect:RECT;

 local @hDc;

 mov eax,uMsg;

 .if    eax == WM_PAINT

invoke BeginPaint,hWnd,addr @stPs;

mov @hDc,eax;

invoke GetClientRect,hWnd,addr @stRect;

invoke DrawText,@hDc,addr szText,-1,addr @stRect,\

DT_SINGLELINE or DT_CENTER or DT_VCENTER;

invoke EndPaint,hWnd,addr @stPs;

 .elseif    eax == WM_CLOSE

invoke DestroyWindow,hWinMain;

invoke PostQuitMessage,NULL;

 .elseif eax==WM_CREATE

      invoke CreateWindowEx,NULL,\

                       offset szButton,offset szButtonText,WS_CHILD or WS_VISIBLE,10,10,65,22,hWnd,1,hInstance,NULL;



 .else

     invoke DefWindowProc,hWnd,uMsg,wParam,lParam;

ret;

 .endif

     xor eax,eax

ret

 WinProc endp;

 _WinMain proc 

      local @stWndClass:WNDCLASSEX;

 local @stMsg:MSG;

 invoke GetModuleHandle,NULL;

 mov hInstance,eax

 invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;

 ;注册窗口类

      invoke LoadCursor,0,IDC_ARROW;

 ;指定鼠标指针

 mov   @stWndClass.hCursor,eax;

 push  hInstance 

 pop   @stWndClass.hInstance;

 mov   @stWndClass.cbSize,sizeof WNDCLASSEX;

 mov   @stWndClass.style,CS_HREDRAW or CS_VREDRAW;

 mov   @stWndClass.lpfnWndProc,offset WinProc;

 mov   @stWndClass.hbrBackground,COLOR_WINDOW+1;

 mov   @stWndClass.lpszClassName,offset szClassName;

 invoke RegisterClassEx,addr @stWndClass;

 ;建立便显示窗口

      invoke CreateWindowEx,WS_EX_CLIENTEDGE,\

 offset szClassName,offset szCaption,\

 WS_OVERLAPPED,100,100,600,400,\

 NULL,NULL,hInstance,NULL;

 mov hWinMain,eax;

 invoke ShowWindow,hWinMain,SW_SHOWNORMAL;

 invoke UpdateWindow,hWinMain;

 ;消息循环

 .while TRUE

      invoke GetMessage,addr @stMsg,NULL,0,0;

  .break.if eax==0
 

 invoke TranslateMessage,addr @stMsg;

 invoke DispatchMessage,hWinMain;

 .endw;

 ret

 _WinMain endp;

 start:

    call _WinMain;

invoke ExitProcess,0;

 end start

可以算是一个小小的Helo World程序,但是因为是第一个,所以总有些与众不同的意味,还请众大神不要笑哈,只是在这儿写下,写这个程序的几点心得,或者说在这过程中犯

下的几个错误:

第一个就是hInstance的定义,有时不太会注意但是hInstance一定要是dd类型的,因为是句柄,所以一定是32位的,因而一定要是32位的,嗯

第二个就是.if eax==WM_CLOSE,对于消息的过滤,在这儿说的不是技术,只是,eax一定要和eax==WM_CLOSE在一行,虽然不用空格,但是也要在一行!!!我在这儿犯

了错误,查了好久,才发现是这个错误,惭愧惭愧.

另外我们知道在创建并显示窗口的时候,在之前会有一个注册窗口类的过程,该过程定义了窗口的类型,样式,或者说,该类是窗口的一个模板,另外,创建并显示窗口的时候

窗口类和显示窗口之间的关系就是通过窗口类的名称进行绑定的!

还有就是父窗口和子窗口的一个关系就是,当父窗口在销毁时,子窗口也会自动销毁,这就是父窗口和子窗口的关系,

在创建Button按钮的时候,或者其他系统中已有的控件的时候,注意两点,一是类的名称,比如button就是"Button",在WS,也就是窗口风格的时候,就是WS_CHILD 还有就是

WS_VISIBLE,好了,就到这里了

标签:窗口,第一个,invoke,汇编程序,mov,win32,eax,stWndClass,addr
From: https://blog.51cto.com/u_15995156/6166909

相关文章

  • win32汇编语言学习之二
        对于汇编语言来说win32环境中只有一种类型,那就是32位整数,例如MessageBoxA的四个参数HWND,LPCTSTR,LPCTSTR,UINT之所以定义成不同的摸样主要是为了说明其用途,我们在汇编环境下调用MessageBoxA时,DOS状态下会是这样的:  pushuType  pushlpCaption  pushlpText ......
  • 微信小程序学习笔记——第一个微信小程序
    打开微信开发者工具 扫码登录之后,创建项目项目创建好之后 ......
  • PC端应用程序自动化测试——pywinauto、pywin32、pyautogui
    1前言PC端自动化测试使用到的python模块主要有pywinauto、win32gui、pyautogui,主要功能如下:pywinauto:主要使用到Application类,用于应用程序管理(打开与关闭应用等)、窗口管理(最小化、最大化、关闭窗口)pywin32:包含win32gui、win32api、win32con3个子模块,用于窗口管理(定位窗......
  • 我的第一个项目(七):(解决问题)Vue中canvas无法绘制图片
    好家伙, 现在,我想要把我的飞机大战塞到我的主页里去,想办法把文件导入 然后,直接死在第一步,图片渲染都成问题 先用vue写一个测试文件来测试canvas的绘制<template><div><divref="stage"></div><button@click="drawsth()">添加</button><imgsrc......
  • 行业动态 | 第一个支持与 ChatGPT 进行面对面聊天的机器人女友(免费可聊)
    生成式AI急速发展GPT-4的上线、文心一言的发布、加上GPT-4植入Office全家桶,不少人感叹:我们每天醒来都被AI的快速发展所震惊,但是更多人感叹自己没有参与其中。国内可用!今天小A介绍一款新的机器人爱丽丝,这是一个免费的网页程序ChatD-ID——世界上第一个允许用户与数字人进行实时对......
  • 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土
    一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、C语言简介C语言是一种高级语言,运行效率仅次于汇编,支持跨平台C语言是学习其他高级语言的基础,如C++、Java和Python三、编程环......
  • python win32gui 无法控制 最小化后的桌面
    当远程桌面被最小化时,发现使用win32gui控制某软件置于最前台显示时失效,并报错:File"C:\Users\Administrator\Desktop\py-auto-login\robot\ktt_auth_code.py",line156,inwx_loginwin32gui.SetForegroundWindow(self._main_wnd)pywintypes.error:(0,'SetForegroun......
  • 【LeetCode】278.第一个错误的版本
    题目描述  解法思路:二分查找注意:当第一个 isBadVersion(mid)的结果为true时,得到第一个错误的版本//TheAPIisBadVersionisdefinedforyou.//boolisBadVe......
  • Linux Shell脚本入门教程系列之(二)第一个shell脚本
    本文是LinuxShell脚本系列教程的第(二)篇,更多shell教程请看:LinuxShell脚本系列教程通过上一篇教程的学习,相信大家已经能够对shell建立起一个大体的印象了,接下来,我们通过一个......
  • 狂神说MyBatis01:第一个程序
    1.简介1.1什么是MyBatisMyBatis是一款优秀的持久层框架MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程MyBatis可以使用简单的XML或注解......