鱼C论坛

 找回密码
 立即注册

WIN32汇编-FirstWindow程序

热度 5已有 1455 次阅读2014-3-11 21:30 |个人分类:笔记之—win32


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
;告诉编译器在本程序中使用的指令集   类似的指令还有.8086  .186 .286 .386/.386p .486/.486p 和.586/.586p  后面带p的
;伪指令表示程序可以使用特权指令  mov cr0,eax  这一类指令必须在特权级0上运行  则需定义为.386p等  
.model flat,stdcall
;.model语句用来定义程序工作的模式 它的使用方法是:.model 内存模式[,语言模式][,其他模式]  内存模式的定义影响最后
;生成的可执行文件  而对于win32程序来说,只有一种内存模式   flat模式 意思是内存从0-4GB  数据段代码段都在这个里面 还
;指定 子程序的调用模式 stdcall不同的语言有不同的调用方式  比如还有c  syscall  basic  win32必须是stdcall
option casemap:none
;这个语句定义程序中的变量和子程序名是否对大小敏感  所以必须指定  不然在调用win32时会出现问题
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc ;图形设备接口,利用VGA DRV之类的显示设备驱动程序完成显示文本和矩行等功能
includelib gdi32.lib
include user32.inc ;用户接口服务,建立窗口和传递信息等
includelib user32.lib
include kernel32.inc ;系统服务功能 包括内存管理 任务管理和动态连接等
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ? ;?相当于0
hWinMain dd ?

.const
szClassName db 'MyClass',0 ;字符串以0结束
szCaptionMain db 'My first Window !',0
szText db 'Welcome to fishc.com!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
;窗口过程是给windows回调用的  它必须遵循规定格式 对窗口过程的子程序并没有规定  对widows来说 窗口过程的地址才是唯
;需要的  窗口过程子程序的参数格式:windowProc  proc  hwnd,uMsg,wParam,lParam 第一个参数是窗口句柄 所以windows回
;调的时候必须指出操作的窗口   第二个参数是消息标识  3、4个参数是消息的两个参数  这四个参数和消息循环中的MSG结构中
;的前四个字段是一样的 
local @stPs:PAINTSTRUCT
;每个窗口要有一个PAINSTRUCT 结构来记录一些绘制信息  PAINSTRUCT结构保存了窗口绘制客户客户区 消息   除老可以的到
;客户去设备描述表的句柄,GetDC也一样可以得到  
;typedef struct tagPAINTSTRUCT
;{ ;   HDC            hdc ; //设备内容句柄 BeginPaint返回该值 ; BOOL       fErase ; //大多数情况下被标志为0 意味着winwods已经擦除了无效的背景 可以在WNDCL //ASS结构中的hbrBackground字段来自定背景擦除行为 这里的WNDCLASS结构是 //是程序在WinMain初始化期间登录窗口类别时使用的。wndclass.hbrBackground = //(HBRUSH) GetStockObject (WHITE_BRUSH) ;
;   RECT       rcPaint ; ; BOOL           fRestore ; ; BOOL           fIncUpdate ; ; BYTE           rgbReserved[32] ; ;} PAINTSTRUCT ; 在 程序呼叫BeginPaint时 Windows会适当填入该结构的各个字段的值 是程序只使用前三个字段 其他字 ;段由windows内部使用
local @stRect:RECT ;RECT结构定义了一个矩形,其四个字段为left、top、right和bottom。PAINTSTRUCT结构 ;的rcPaint字段定义了无效矩形的边界
local @hDc

mov eax,uMsg
;********************************************************************
.if eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
;为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中     hWnd:[输入]被重绘的窗口HANDLE   lpPaint:[输出]指向一个用来接收绘画信息的PAINTSTRUCT结构   如果函数成功,返回值是指定窗口的显示设
;备内容HANDLE
mov @hDc,eax

invoke GetClientRect,hWnd,addr @stRect
;该函数获取窗口客户区的坐标  第一个参数是程序窗口的句柄。第二个参数是一个指标 指向一个RECT型态的rectangle结构
invoke DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
;在指定的区域内输出格式化的文本   hDC是设备上下文句柄。lpString指向将要绘制的UNICODE文本。nCount是要输出的字符
;数 如果nCount = -1,则Windows自动计算字符数,不过此时lpString所指向的必须是以NULL结尾的字符串。lpRect指向rect结
;构体,指定了文本格式化的矩形区域。uFormat是格式化标记,文本显示的方式 比如DT_CENTER:指定文本水平居中显示。

invoke EndPaint,hWnd,addr @stPs
;EndPaint函数标记指定窗口的绘画过程结束;这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成后hWnd:
;[输入]已经被重画的窗口的HANDLE   lpPaint:[输入]指向一个PAINTSTRUCT结构,该结构包含了绘画信息,是BeginPaint函
;数返回的返回值:
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain   ;销毁窗口
invoke PostQuitMessage,NULL  ;发出WM_QUIT消息  退出消息循环
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
;该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。调用
;DefWindowProc函数时使用窗口过程接收的相同参数。    hWnd:指向接收消息的窗口过程的句柄。Msg:指定消息型
;wParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。IParam:指定其余的、消息特定的信息。该参数
;的内容与Msg参数值有关。返回值:返回值就是消息处理结果,它与发送的消息有关。
ret
.endif
;********************************************************************
xor eax,eax   ;清零eax   
ret

_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
;   WNDCLASSEX结构用于注册窗口类

;  注册实例:

;  ATOM MyRegisterClass( HINSTANCE hInstance )

;  {

;  WNDCLASSEX wcex;

;  wcex.cbSize = sizeof( WNDCLASSEX ); WNDCLASSEX 的大小

;  wcex.style = CS_HREDRAW | CS_VREDRAW;从这个窗口类派生的窗口具有的风格。您可以用“or”操作符来把几个风格

; 或到一起。

;  wcex.lpfnWndProc = (WNDPROC) WndProc; 窗口处理函数的指针

;  wcex.cbClsExtra = 0; 指定紧跟在窗口类结构后的附加字节数。

;  wcex.cbWndExtra = 0; 指定紧跟在窗口事例后的附加字节数。

;  wcex.hInstance = hInstance; 本模块的事例句柄

;  wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION ); 图标的句柄。

;  wcex.hCursor = LoadCursor( NULL, IDC_ARROW );  光标的句柄。

;  wcex.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH ); 背景画刷的句柄。

;  wcex.lpszMenuName = NULL; 指向菜单的指针。

;  wcex.lpszClassName = "My Class"; 指向类名称的指针。

;  wcex.hIconSm = LoadIcon( NULL, IDI_WINLOGO );和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换

; 成大小合适的小图标。

;  return RegisterClassEx( &wcex );

;  }

;local @stMsg:MSG
;typedef struct tagMSG {

;  HWND hwnd; 表示消息所属的窗口

;  UINT message;指定了消息的标识符

;  WPARAM wParam;      第三、第四个成员变量wParam和lParam,用于指定消息的附加信息

;  LPARAM lParam;

;  DWORD time;消息投递到消息队列中的时间

;  POINT pt;鼠标的当前位置

;  } MSG;


invoke GetModuleHandle,NULL  ;获得当前窗口的句柄
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass    ;填零操作
;********************************************************************
; 注册窗口类
;********************************************************************
invoke LoadCursor,0,IDC_ARROW
;该函数从一个与应用事例相关的可执行文件(EXE文件)中载入指定的光标资源。该函数已被Loadlmage函数替代。
;  函数原型:HCURSOR LoadCursor(HINSTANCE hlnstance,LPCTSTR lpCursorName);
;  参数:
;  hlnstance:标识一个模块事例,它的可执行文件包含要载入的光标。
;  LpCursorName:指向以NULL结束的字符串的指针,该字符串存有等载入的光标资源名。该参数低位字节和高位字节0组
;成资源标识器也可以由低位字为资源标识符和高位字为零组成。也可以用MAKEINTRESOURCE宏命令创建该值。要使用
;Win32预定义的一个光标,应用程序必须把hlnstance参数设为NULL 并把IpCursorName设为如下值之一:
;  IDC_APPSTARTING 标准的箭头和小沙漏
;  IDC_ARROW 标准的箭头
;  IDC_CROSS 十字光标
;  IDC_HELP 标准的箭头和问号
;  IDC_IBEAM 工字光标
;  IDC_NO 禁止圈 
;  IDC_SIZEALL 四向箭头指向东、西、南、北
;  IDC_SIZENESW 双箭头指向东北和西南 
;  IDC_SIZENS 双箭头指向南北
;  IDC_SIZENWSE 双箭头指向西北和东南
;  IDC_SIZEWE 双箭头指向东西 
;  IDC_UPARROW 垂直箭头
;  IDC_WAIT 沙漏返回值:如果成功,返回值是新载入的光标的句柄:如果失败,返回值是NULL。若想获得更多错误信;;
;,请调用GetLastError函数。
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 _ProcWinMain ;windows调用窗口过程
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass ;注册窗口类    参数是一个WNDCLASS  在注册前先要填好参数
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
100,100,600,400,\           ;指定窗口的初始位置以及宽度 
NULL,NULL,hInstance,NULL hWndParent:指向被创建窗口的父窗口或所有者窗口的句柄
;hMenu:菜单句柄,或依据窗口风格指明一个子窗口标识。
; hlnstance:与窗口相关联的模块事例的句柄。
;lpParam:指向一个值的指针,该值传递给窗口 WM_CREATE消息。
;函数创建一个具有扩展风格的重叠式窗口、弹出式窗口或子窗口  参数含义分别是 1)指定窗口的扩展风格  2)IpClassName:
;指向一个空结束的字符串或整型数atom  如果lpClassName是一个字符串,它指定了窗口的类名。 3)lpWindowName:指向一
:个指定窗口名的空结束的字符串指针 如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使
;用CreateWindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。 4)dwStyle:指定
;创建窗口的风格。
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,addr @stMsg
.endw
ret

_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start


路过

鸡蛋
5

鲜花

握手

雷人

刚表态过的朋友 (5 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部