zoukankan      html  css  js  c++  java
  • Win32汇编环境搭建教程(MASM32 SDK)

    一、说明

    常用的32位汇编编译器有微软的MASM、Borland的TASM和NASM。

    编译器 开发者 优点 缺点
    MASM 微软 微软自家软件和系统兼容性好;支持invoke/.if等伪指令将汇编变得和C++差不多 就一个编译器,没有资源编译器和链接器,也没有头文件
    TASM Borland 支持伪指令,有资源编译器和链接器 没有Windows数据结构和预定义的头文件,现在官方似乎不维护了
    NASM 开源 同时支持Windows和Linux 不支持伪指令,没有Windows数据结构和预定义的头文件

    不过他们各有自己的不足,一般使用基于MASM的MASM32 SDK做为开发环境;虽然叫masm32 但是直接装在64位操作系统上也是没问题的。

    二、MASM32 SDK安装

    2.1 下载

    下载链接:http://www.masm32.com/download.htm

    2.2 安装

    当前我下载的是v11r版本,将下载的zip包解压后得到的是一个齿轮图标的install.exe文件,双击运行开始安装。

    选择安装的磁盘(masm32 sdk需要安装在根目录下所以只能选磁盘不能自定义目录)

    后续一路点“确定”、“Yes”或“OK”就行了,直到下图所示即完成安装。

    2.3 配置环境变量

    打开:控制面板--系统和安全--系统--高级系统设置--高级--环境变量

    创建以下环境变量(如果已存在则在其末尾追加,Masm32Dir根据自己安装路径修改):

    Masm32Dir=D:masm32
    include=%Masm32Dir%Include;
    lib=%Masm32Dir%lib;
    path=%Masm32Dir%Bin;%Masm32Dir%;

    三、MASM32 SDK开发示例

    3.1 集成开发环境

    不管什么语言开发,我们习惯于有一个IDE以方便编写、编译、链接、调试,MASM32 SDK自带有一个IDE----Quick Editor(安装完后在桌面创的那个快捷方式就是),但它实质就只是一个简单的文本编缉器,实际上32位汇编当前就没有什么IDE(RadASM和MASMPlus没用过不过感觉也不是我们认识的那种IDE)。

    32位汇编开发一般都是用UtralEdit或Notepad++等文本编缉器编写代码文件和资源文件,然后手动敲命令进行编译链接(下节我们会演示这个过程)。

    其实没有IDE这样手动也不全是坏事,既然都学汇编了不如索性全手动。

    3.2 示例代码

    资源文件helloworld.rc:

    // 资源文件注释格式为双斜杠
    // 包含资源头文件,以能使用头键字
    #include    <resource.h>
    
    // 指定对话框ID,asm文件中要定义同值变量才可引用
    #define    DLG_HELLOWORLD    1
    
    // 定义对话框结构
    DLG_HELLOWORLD    DIALOG 350,200,213,164
    STYLE                        DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
    CAPTION                    "Helloworld Program"
    FONT                        11,"宋体"
    {
        CTEXT    "Win32 Assembly Helloworld Program",-1,50,54,170,21
        CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,79,203,1
        DEFPUSHBUTTON "退出",IDOK,158,86,50,21
    }

    代码文件helloworld.asm:

    ; asm文件注释格式为分号
    ; 定义程序模式
    .386
    .model            flat,stdcall
    option            casemap    :none
    
    ; 包含必要头文件,基本每个win32 汇编程序都需要包含这几个
    include            windows.inc
    include            user32.inc
    includelib       user32.lib
    include            kernel32.inc
    includelib       kernel32.lib
    
    ; 指定对话框ID,该ID要与rc文件中的ID值相同
    ; 理论上,asm文件与rc文件中的控件是通过ID值关联的,控件名并不需要与rc文件相同,不过为了易看一般取一样的
    ; 比如这里重点是equ 1,叫不叫DLG_HELLOWORLD无所谓,不过为了易看所以选择与rc文件保持一致
    DLG_HELLOWORLD    equ    1
    
    ; 数据段
    .data?
    hInstance    dd    ?
    
    ; 代码段
    .code
    ; 对话框处理过程
    _ProcDlgHelloworld proc uses ebx edi esi hWnd,wMsg,wParam,lParam
        mov    eax,wMsg
        .if eax == WM_CLOSE
                invoke    EndDialog,hWnd,NULL
        .elseif eax == WM_INITDIALOG
                ;invoke    LoadIcon,hInstance,ICO_MAIN
                ;incoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
        .elseif eax == WM_COMMAND
                mov    eax,wParam
                .if ax == IDOK
                        invoke    EndDialog,hWnd,NULL
                .endif
        .else
                mov    eax,FALSE
                ret
        .endif
        mov    eax,TRUE
        ret
    _ProcDlgHelloworld    endp
    
    start:
        invoke    GetModuleHandle,NULL
        mov       hInstance,eax
        ; 弹出对话框,对话框与及处理过程在这里绑定
        invoke    DialogBoxParam,hInstance,DLG_HELLOWORLD,NULL,offset _ProcDlgHelloworld,NULL
        invoke    ExitProcess,NULL
        ; 指定程序入口点为start标识处
        end       start

    3.3 编译运行

    我这里将两个文件保存在了F:masm32helloworld目录下,编译运行如下:

    rc helloworld.rc
    ml /c /coff helloworld.asm
    link /subsystem:windows helloworld.obj helloworld.res
    helloworld.exe

    程序运行界面如下:

    四、借助VC++6.0【可选】

    所谓借助vc其借助之处有二:一是直接用vc来编写资源文件,二可以借用nmake.exe来进行编译链接。

     4.1 使用VC++6.0编写资源文件

    在前面helloworld中我们直接手动编写资源文件(helloworld.rc),这种方式由于不是所见即所得在实际编写时为了调整位置和大小,需要反复进行修改编译运行,这是比较麻烦的。我们可以使用vc进行所见即所得的资源文件编缉。

    不过VC++编缉.rc文件保存时会自动添加一些VC++的头文件如果继续保存为.rc文件,为了保证使用rc命令编译成.res时能找到所有文件,需要把VC++的%VC_HOME%VC98Include目录追加到第3步中的include环境变量中,把%VC_HOME%VC98Lib目录追加到第3步中的lib环境变量中;当然也可以在编缉后直接保存成编译好的.res文件,免去rc编译步骤。

    可以建一个VC项目来编缉资源文件最后把复制出来用,也可以先编译出一个res文件然后托到vc里编缉。

    4.2 借用nmake.exe进行编译链接

    在前面helloworld程序中,我们通过rc、ml和link三条命令进行编译链接,每次改动都得反复敲打执行这几条命令这是比较麻烦的。

    nmake可以直接根据makefile执行rc、ml和link完成程序编译链接(makefile放于与源代码同级目录下,在makefile目录下执行nmake),如果是一个比较大的需要反复修改的程序建议使用nmake进行编译链接。操作过程如下:

    第一步,到%VC_HOME%VC98Bin目录下把nmake.exe复制到%Masm32Dir%Bin目录下。

    第二步,编写makefile

    第三步,进行编译运行。

    以前边helloworld程序为例,makefile如下:

    EXE = helloworld.exe        #指定输出文件
    OBJS = helloworld.obj       #需要的目标文件
    RES = helloworld.res        #需要的资源文件
    
    LINK_FLAG = /subsystem:windows    #连接选项
    ML_FLAG = /c /coff            #编译选项
    
    $(EXE): $(OBJS) $(RES)
        Link $(LINK_FLAG) $(OBJS) $(RES)
    
    .asm.obj:
        ml $(ML_FLAG) $<
    .rc.res:
        rc $<
    
    clean:
        del *.obj
        del *.res

    编译运行如下(每次修改相当于只需要执行nmake一条命令操作简单多了):

    参考:

    Windows环境下32位汇编语言程序设计

  • 相关阅读:
    iis日志时间与本地日期不一样
    iis原理介绍
    IIS如何确定请求的处理程序
    handle 和module
    调试IIS服务器
    JS面向对象学习
    图片垂直居中大杂烩
    淘宝双十一页面(Flexible)
    用rem适配移动端
    About getByClass
  • 原文地址:https://www.cnblogs.com/lsdb/p/7402955.html
Copyright © 2011-2022 走看看