• 架设WIN32汇编程序的开发环境


    笔者在学习Windows下的图形界面应用程序(GUI,Graphical User Interface)的时候碰到的第一个麻烦就是架设WIN32汇编程序的开发环境,在这里笔者愿意和大家分享这段经历。

    笔者认为大家应该首先具备下列概念和文件:

    • 操作系统:首先大家应该具备Windows98以上操作系统,看起来这并不是什么难事
    • 文本编辑程序:你可以选择Windows自带的记事本,或者是Ultraedit,而笔者却独钟于VisualStudio
    • 应用程序编程接口(API, Application Programming Interface),它是一些类型、常量和函数的集合,它提供了直接通过编程操纵对象的途径
    • Win32平台软件开发包(Win32 Platform SDK),这一些用于创建Windows应用程序的工具软件、库文件、代码例程和帮助文档的集合。Microsoft提供Platform SDK的免费下载http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
    • Microsoft汇编器(ML,它是Make.exe和Link.ext首字母的缩写),可以用它汇编并链接一个或多个汇编程序源文件,它的命令行参数选项可以在Microsoft MASM手册中查到。(遗憾的是该手册自1992年以后就没有再版过了,读者只能下载其电子版)
    • 资源文件,它是各种各样的元素集合,这些元素包括向用户提供信息的界面元素(如位图、图标或光标),含有应用程序所需数据的自定义资源,由安装 API 使用的版本资源,以及菜单和对话框资源。它为程序的逻辑界面与资源界面隔离提供了较好的实现。更多的信息读者可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/zabda143(VS.80).aspx
    • 预定义头文件(RESOURCE.H):它提供了资源标示符的定义
    • 资源编译器:RC.EXE将编写的资源脚本文件(*.RC)编程成资源文件(*.RES,然后由CVTRES.EXE转换为OBJ文件

    好了,现在我们开始架设WIN32汇编程序的开发环境

    • Visual Studio是个不错的开发环境,《Intel汇编语言程序设计》的作者Kip R.Irvine就是在这个平台上开发和教学的,此平台的架设读者可以参看以下内容http://blog.csdn.net/KingWolfOfSky/archive/2009/07/12/4342511.aspx
    • Microsoft也提供了试用版(90天)的下载http://msdn.microsoft.com/zh-cn/sqlserver/aa700831.aspx
    • 但仍然有很多人是不愿意安装几个G的VisualStudio,那么Microsoft提供了MASM32的下载http://www.masm32.com/masmdl.htm

    安装完成以后在Masm32文件夹下新建一个“MyDocument”文件夹,将下面代码放入其中

     1 TITLE Demo.asm
     2 ; ===============================================
     3 ;       Author:    狼の禅
     4 ;       Date:    23/07/2009
     5 ; ===============================================
     6         .486
     7         .model flat,stdcall
     8         option casemap:none   
     9         include /masm32/include/windows.inc
    10         include /masm32/include/user32.inc
    11         include /masm32/include/kernel32.inc
    12         include /masm32/include/gdi32.inc
    13 
    14         includelib /masm32/lib/user32.lib
    15         includelib /masm32/lib/kernel32.lib
    16         includelib /masm32/lib/gdi32.lib
    17 ; -----------------------------------------------
    18         WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
    19         WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    20 ; ===============================================
    21 .data
    22         hInstance     dd 0
    23         hWnd          dd 0
    24 
    25         szClassName   db "Demo",0
    26         szDisplayName db "My Demo",0
    27 ; ===============================================
    28 .code
    29 start:
    30         invoke GetModuleHandle,0
    31         mov hInstance,eax
    32         invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
    33         invoke ExitProcess,eax
    34 ; ===============================================
    35 WinMain proc hInst:DWORD, hPrevInst:DWORD, 
    36         CmdLine:DWORD, CmdShow:DWORD
    37 
    38         LOCAL wndclass:WNDCLASSEX
    39         LOCAL Msg:MSG
    40 
    41         mov wndclass.cbSize,sizeof WNDCLASSEX
    42         mov wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
    43         mov wndclass.lpfnWndProc,OFFSET WndProc
    44         mov wndclass.cbClsExtra,0
    45         mov wndclass.cbWndExtra,0
    46         mov eax,hInst
    47         mov wndclass.hInstance,eax
    48         mov wndclass.hbrBackground,COLOR_WINDOW+1
    49         mov wndclass.lpszMenuName,0
    50         mov wndclass.lpszClassName,OFFSET szClassName
    51         invoke LoadIcon,hInst,NULL
    52         mov wndclass.hIcon,eax
    53         invoke LoadCursor,0,IDC_ARROW
    54         mov wndclass.hCursor,eax
    55         mov wndclass.hIconSm,0
    56 
    57         invoke RegisterClassEx,ADDR wndclass
    58         invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR szClassName,
    59                               ADDR szDisplayName,
    60                               WS_OVERLAPPEDWINDOW,
    61                               200,50,500,300,
    62                               0,0,
    63                               hInst,0
    64         mov   hWnd,eax
    65 
    66         invoke ShowWindow,hWnd,SW_SHOWNORMAL
    67         invoke UpdateWindow,hWnd
    68 
    69 MessageLoop:
    70         invoke GetMessage,ADDR Msg,0,0,0
    71         cmp eax,0
    72         je ExitProgram
    73         invoke TranslateMessage,ADDR Msg
    74         invoke DispatchMessage,ADDR Msg
    75         jmp MessageLoop
    76 ExitProgram:
    77         mov eax,Msg.wParam 
    78         ret
    79 WinMain endp
    80 ; ===============================================
    81 WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    82         .if uMsg == WM_DESTROY
    83                 invoke PostQuitMessage,0
    84         .else
    85             invoke DefWindowProc,hWin,uMsg,wParam,lParam
    86             ret
    87         .endif
    88         xor eax,eax
    89         ret
    90 WndProc endp
    91 ; ===============================================
    92 end start

    在命令行程序中进入在bin目录下输入ml /coff ../MyDocument/demo.asm

    显示如下

     

    在bin文件夹中可以看到demo.obj和demo.exe文件生成,打开demo.exe文件显示如下,那么你的环境就已经配置成功了

     

     

    • 另外,笔者也提供了一个简易的开发环境和范例http://d.download.csdn.net/down/1513555/kingwolfofsky
  • 相关阅读:
    CentOS进程资源占用高原因分析命令
    Centos下修改启动项和网络配置
    CentOS查看系统信息命令和方法
    [vim]设置vim语法高亮显示和自动缩进
    [vim]vim中有中文乱码
    setState回调
    服务器安装nginx
    小程序map
    后台合成图片
    阿里云服务器添加nginx
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3261212.html
Copyright © 2020-2023  润新知