欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WIN32汇编-HELLO,WORLD!

程序员文章站 2022-04-29 13:19:13
...



 

 我们用WIN32汇编构建第一个WINODWS程序,这个程序完成显示一个带问号的对话框,对话框的内容是现在系统时间。

   首先,打开MASM32Editor(在桌面上可以找到图标),在里面输入以下代码:
     .386
     .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
;#################################################################
   .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
;#################################################################
end start
  将上述代码保存为HELLOWORLD.ASM后,对程序进行编译。
  在编译前参照下图设置好系统的环境变量,path变量加上x:\masm32\bin,lib变量加上x:\masm32\lib,include变量加上x:\masm32\include。
WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  确环境变量设置好后,进入DOS窗口开始编译。
   首先运行ml,编译成coff文件格式
WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  然后运行LINK,进行链接,生成EXE文件,

WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  大功造成,运行一下试试效果吧!

WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
 下面我们接着来做一个有些难度的helloworld,这个程序将系统时间直接显示在桌面上。程序源代码如下:
    .386
     .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
;#########################################################################
   .data?
      szbuffer db 100 dup(?)
   .data
      szmssuce* 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,offsetszmssuce*,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变量如何表示颜色呢,只有一个双字大小,它的表示格式是(16进制):
0x00bbggrr
bb表示蓝色,gg表示绿色,rr表示红色
00FF0000h:蓝
0000ff00h:绿
000000FFh:红
程序运行效果如下:

WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
笔者几年前用WIN32汇编做的几个小作品,欢迎大家试用
掂花即时朗读王
 http://skycn.net/soft/36318.html
掂花反键盘鼠标记录器
  • WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  • 大小: 67.3 KB
  • WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  • 大小: 21.4 KB
  • WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  • 大小: 12.8 KB
  • WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  • 大小: 7.7 KB
  • WIN32汇编-HELLO,WORLD!
            
    
    博客分类: WIN32系统开发 WindowsDOS.netF#HTML 
  • 大小: 11.6 KB