我们用WIN32汇编构建第一个WINODWS程序,这个程序完成显示一个带问号的对话框,对话框的内容是现在系统时间。
首先,打开MASM32Editor(在桌面上可以找到图标),在里面输入以下代码:
.386
.model flat, stdcall
option casemap :none
.model flat, stdcall
option casemap :none
;#################################################################
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
includelib masm32.lib
include user32.inc
include kernel32.inc
include gdi32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
includelib masm32.lib
;#################################################################
.data?
szbuffer db 100 dup(?)
.data
szcaptionName db "我的HELLO,WORLD!",0
szbegin db "现在时间:"
sztext db 100 dup(?)
;################################################################# .code
.data?
szbuffer db 100 dup(?)
.data
szcaptionName db "我的HELLO,WORLD!",0
szbegin db "现在时间:"
sztext db 100 dup(?)
;################################################################# .code
start:
;程序的入口
call _callgetnow
invoke MessageBox,NULL,offset szbegin,offsetszcaptionName,MB_ICONQUESTION or MB_OK
invoke ExitProcess,eax
;#################################################################
_callgetnow proc
pushad
invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100
invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100
invokeszCatStr,addr sztext,addr szbuffer
popad
ret
_callgetnow endp
;#################################################################
;程序的入口
call _callgetnow
invoke MessageBox,NULL,offset szbegin,offsetszcaptionName,MB_ICONQUESTION or MB_OK
invoke ExitProcess,eax
;#################################################################
_callgetnow proc
pushad
invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100
invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100
invokeszCatStr,addr sztext,addr szbuffer
popad
ret
_callgetnow endp
;#################################################################
end start
将上述代码保存为HELLOWORLD.ASM后,对程序进行编译。
在编译前参照下图设置好系统的环境变量,path变量加上x:\masm32\bin,lib变量加上x:\masm32\lib,include变量加上x:\masm32\include。
确环境变量设置好后,进入DOS窗口开始编译。
首先运行ml,编译成coff文件格式
然后运行LINK,进行链接,生成EXE文件,
.386
.model flat, stdcall
option casemap :none
.model flat, stdcall
option casemap :none
;#########################################################################
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
includelib masm32.lib
include user32.inc
include kernel32.inc
include gdi32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
includelib masm32.lib
;#########################################################################
.data?
szbuffer db 100 dup(?)
.data
szmssucesscap db "HELLO,WORLD!深入",0
szmssucesstext db "在桌面的(300,300)处显示了当前时间",0
szmscap db "错误",0
szmstext1 db "无法在桌面上显示!",0
szmstext2 db "无法得到全屏DC!",0
szbegin db "现在时间:"
sztext db 100 dup(?)
;#########################################################################
.code
.data?
szbuffer db 100 dup(?)
.data
szmssucesscap db "HELLO,WORLD!深入",0
szmssucesstext db "在桌面的(300,300)处显示了当前时间",0
szmscap db "错误",0
szmstext1 db "无法在桌面上显示!",0
szmstext2 db "无法得到全屏DC!",0
szbegin db "现在时间:"
sztext db 100 dup(?)
;#########################################################################
.code
start:
;程序的入口
_showtext proto :DWORD
call _callgetnow
invoke _showtext,offset szbegin
invoke ExitProcess,eax
;#########################################################################
_callgetnow proc
pushad
invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100
invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100
invokeszCatStr,addr sztext,addr szbuffer
popad
ret
_callgetnow endp
;#########################################################################
_showtext proc lpsztext:DWORD
LOCAL@Desktopdc:HDC
LOCAL@dwcolor:DWORD
pushad
mov@dwcolor,00FF0000h
invokeGetWindowDC,NULL
cmpeax,0
jne @f
invokeMessageBox,NULL,offset szmstext2,offset szmscap,MB_ICONERROR
@@:
mov@Desktopdc,eax
invokelstrlen,lpsztext
movebx,eax
invokeSetBkMode,@Desktopdc,TRANSPARENT
invokeSetTextColor,@Desktopdc,@dwcolor
invokeTextOut,@Desktopdc,300,300,lpsztext,ebx
invokeMessageBox,NULL,offset szmssucesstext,offsetszmssucesscap,MB_ICONINFORMATION
cmpeax,0
jne @f
invokeMessageBox,NULL,offset szmstext1,offset szmscap,MB_ICONERROR
@@:
popad
ret
_showtext endp
;#########################################################################
;程序的入口
_showtext proto :DWORD
call _callgetnow
invoke _showtext,offset szbegin
invoke ExitProcess,eax
;#########################################################################
_callgetnow proc
pushad
invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100
invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100
invokeszCatStr,addr sztext,addr szbuffer
popad
ret
_callgetnow endp
;#########################################################################
_showtext proc lpsztext:DWORD
LOCAL@Desktopdc:HDC
LOCAL@dwcolor:DWORD
pushad
mov@dwcolor,00FF0000h
invokeGetWindowDC,NULL
cmpeax,0
jne @f
invokeMessageBox,NULL,offset szmstext2,offset szmscap,MB_ICONERROR
@@:
mov@Desktopdc,eax
invokelstrlen,lpsztext
movebx,eax
invokeSetBkMode,@Desktopdc,TRANSPARENT
invokeSetTextColor,@Desktopdc,@dwcolor
invokeTextOut,@Desktopdc,300,300,lpsztext,ebx
invokeMessageBox,NULL,offset szmssucesstext,offsetszmssucesscap,MB_ICONINFORMATION
cmpeax,0
jne @f
invokeMessageBox,NULL,offset szmstext1,offset szmscap,MB_ICONERROR
@@:
popad
ret
_showtext endp
;#########################################################################
end start
以上程序中有几个重要的GDI相关的API,下面简要介绍一下
(1)
invoke SetBkMode,@Desktopdc,TRANSPARENT
设置背景方式为透明
(2)
invoke SetTextColor,@Desktopdc,@dwcolor
设置字体颜色为蓝色
(3)
invoke TextOut,@Desktopdc,300,300,lpsztext,ebx
在300,300处显示文本
(4)
invoke GetWindowDC,NULL
取得桌面DC
(5)
mov @dwcolor,00FF0000h
设置颜色为蓝色。@dwcolor是一个DWORD型的变量,
可以在相关头文件中找到这样的定义:
typedef DWORD COLORREF;
因此COLORREF类型的变量就是DWORD型变量。
因此COLORREF类型的变量就是DWORD型变量。
COLORREF变量如何表示颜色呢,只有一个双字大小,它的表示格式是(16进制):
0x00bbggrr
bb表示蓝色,gg表示绿色,rr表示红色
00FF0000h:蓝
0000ff00h:绿
000000FFh:红
程序运行效果如下:
笔者几年前用WIN32汇编做的几个小作品,欢迎大家试用
掂花即时朗读王
http://skycn.net/soft/36318.html
http://skycn.net/soft/36318.html
掂花反键盘鼠标记录器
http://skycn.net/soft/34342.html