Win32汇编环境搭建教程(MASM32 SDK)

摘要:
2.3打开配置环境变量:控制面板-系统和安全-系统-高级系统设置-高级-环境变量创建以下环境变量:Masm32Dir=D:masm32include=%Masm32Dir%Include;lib=%Masm32Dir%lib;路径=%Masm32Dir%Bin;%Masm32Dir%;3、 MASM32SDK开发示例3.1集成开发环境无论语言开发如何,我们都习惯于使用IDE来方便编写、编译、链接和调试。MASM32SDK附带了一个IDE——QuickEditor,但本质上它只是一个简单的文本编辑器。事实上,32位程序集当前没有IDE。

一、说明

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

编译器开发者优点缺点
MASM微软微软自家软件和系统兼容性好;支持invoke/.if等伪指令将汇编变得和C++差不多就一个编译器,没有资源编译器和链接器,也没有头文件
TASMBorland支持伪指令,有资源编译器和链接器没有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文件,双击运行开始安装。

Win32汇编环境搭建教程(MASM32 SDK)第1张

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

Win32汇编环境搭建教程(MASM32 SDK)第2张

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

Win32汇编环境搭建教程(MASM32 SDK)第3张

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

Win32汇编环境搭建教程(MASM32 SDK)第4张

程序运行界面如下:

Win32汇编环境搭建教程(MASM32 SDK)第5张

四、借助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一条命令操作简单多了):

Win32汇编环境搭建教程(MASM32 SDK)第6张

参考:

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

免责声明:文章转载自《Win32汇编环境搭建教程(MASM32 SDK)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt笔记——绘图(QBitmap,QPixmap,QImage,QPicture)Java学习之包下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

编译预处理命令--define和ifdef的使用

这里将对常用的预处理命令进行学习。 一、宏定义  ·defined  格式:`defined     宏名      数值      或者 `define      宏名   注意:后面没有‘;‘,和单片机不一样; 二、文件包含处理 ·include  include 的格式在不同的编译器里是不一样的:  在quartus 中为:·include "def...

Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行

   (本文是基于老版本的VS和Xamarin,而VS2017已经集成了Xamarin,所以,本文已经过时,最新的Xamarin开发介绍请参见 使用 Xamarin开发手机聊天程序 。)    如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的...

【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2nQzsuqq7Avgs8wsRizUhw 作者:Gcaufy 导语 Bugly 之前发了一篇关于微信小程序的开发经验分享(点击阅读),小伙伴们在公众账号后台问了很多关于小程序开发方面的问题,精神哥在查阅相关内容...

CSS3(七) 前端预处理技术(Less、Sass、CoffeeScript)

目录 一、Less 1.1、概要 1.2、变量 1.3、解析Less 1.3.1、在线处理 1.3.2、预处理 1.4、混入(Mixins) 1.5、嵌套    1.6、运算 1.7、函数 1.8、继承     1.9、作用域 1.10、注释 二、Sass 2.1、变量 2.2、嵌套 2.3、导入 2.4、mixin 混入 2.5、扩展/继承...

【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介  1. 内核功能简介 (1) 操作系统 和 内核 简介 操作系统 :  -- 功能 : 完成基本功能 和 系统管理; -- 组成 : 内核(kernel), 设备...

在WINDOWS中安装使用GSL(MinGW64+Sublime Text3 &amp;amp; Visual Studio)

        本文介绍在Windows下安装使用GSL库,涉及GSL两个版本(官方最新版及GSL1.8 VC版)、msys shell、GCC、G++等内容,最终实现对GSL安装及示例基于MinGW64在Sublime Text3下的编译运行,并实现GSL在Visual Studio下的使用及部分示例测试。还介绍了GSL1.8 VC版本的编译使用过程。...