一、说明

常用的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 ,,,
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Helloworld Program"
FONT ,"宋体"
{
CTEXT "Win32 Assembly Helloworld Program",-,,,,
CONTROL "",-,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,,,,
DEFPUSHBUTTON "退出",IDOK,,,,
}

代码文件helloworld.asm:

; asm文件注释格式为分号
; 定义程序模式
.
.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 ; 数据段
.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:\masm32\helloworld目录下,编译运行如下:

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%\VC98\Include目录追加到第3步中的include环境变量中,把%VC_HOME%\VC98\Lib目录追加到第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%\VC98\Bin目录下把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位汇编语言程序设计

Win32汇编环境搭建教程(MASM32 SDK)的更多相关文章

  1. Openssl的编译安装以及Vs2012上环境搭建教程

    Openssl的编译安装以及Vs2012上环境搭建教程 一.Openssl的编译安装 一.准备工作 1.Openssl下载地址:https://www.openssl.org/source/ 2.Ac ...

  2. 虚拟机IOS开发环境搭建教程

    来源:http://www.cnblogs.com/xiaoyaoju/archive/2013/05/21/3091171.html 安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB ...

  3. (一)phoneGap之环境搭建教程及其example分析

    phoneGap之环境搭建教程及其example分析 一.环境搭建 与普通的开发android应用一样,phoneGap也同于原生android应用一样,环境相同,只是有部分不同,下面就我做理解,进行 ...

  4. 转---详细的Android开发环境搭建教程

    五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程 引言   在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立A ...

  5. Windows Server 2003 IIS6.0+PHP5(FastCGI)+MySQL5环境搭建教程

    准备篇 一.环境说明: 操作系统:Windows Server 2003 SP2 32位 PHP版本:php 5.3.14(我用的php 5.3.10安装版) MySQL版本:MySQL5.5.25 ...

  6. Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程

    原文地址:http://www.osyunwei.com/archives/7378.html 搬运是为了自己找资料方便. 准备篇 一.环境说明: 操作系统:Windows Server 2012 R ...

  7. Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程

    准备篇 一.环境说明: 操作系统:Windows Server 2012 R2 PHP版本:php 5.5.8 MySQL版本:MySQL5.6.15 二.相关软件下载: 1.PHP下载地址: htt ...

  8. LAMP环境搭建教程

    原文:LAMP环境搭建教程 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.M ...

  9. Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程

    这篇文章主要介绍了Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程,需要的朋友可以参考下 准备篇 一.环境说明: 操作系统:Windows Server 201 ...

随机推荐

  1. P4574 [CQOI2013]二进制A+B

    传送门 思路: 本题可用数位DP来做,设 f [ i ][ a ][ b ][ c ][ j ] 表示当前枚举到(二进制下的)第i位,a' b' c'各用a,b,c了几个1,j表示最后一位是否有进位. ...

  2. mysql Percona-XtraBackup backup

    全量备份FULL BACKUP https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/full_backup.html ...

  3. Mysql简单入门

    这两天比较懒,没有学习,这个是我问一个学java的小伙伴要的sql的总结资料,大体语句全在上面了,复制到博客上,以后忘记可以查看 #1命令行连接MySQLmsyql -u root -proot;#2 ...

  4. sklearn中的train_test_split (随机划分训练集和测试集)

    官方文档:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html ...

  5. 关于vue的语法规则检测报错问题

    搭建了一个vue项目,在配置路有的时候,陆续出现了各种报错其中最多的是一些写法,例如空格,缩进,各种括号,结果我一句一句对照,修改相当之费时间,效率低,一上午,一个路由配置都没写好 主要报错如下: 截 ...

  6. QT json字符串生成和解析

    1         QT json字符串生成和解析 1.1  QT Json解析流程 (1)  字符串转化为QJsonDocument QJsonParseError json_error; QJso ...

  7. Golang atomic

    原子操作函数 分为下面系列函数,其中Xxx可以是Int32/Int64/Uint32/Uint64/Uintptr/Pointer其中一种. 1.SwapXxx系列:交换新旧值: // SwapInt ...

  8. Squid代理配置

    更改squid错误页面时间不对的问题解压源码包,进入此路径/usr/local/squid/share/errors/zh-cn(需要更改该目录下的所有文件find -type f |xargs se ...

  9. 常用音频协议介绍&&有关音频编码的知识与技术参数

    (转载)常用音频协议介绍 会议电视常用音频协议介绍及对比白皮书 一.数字化音频原理:声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线.通常人耳可以听到的频率在20 ...

  10. javaweb课程信息管理系统

    1.DBUtil包连接数据库 2.Bin包设计成员函数及方法 3.Dao包设计sql语句 4.servlet包增删改查方法 5.service连接servlet 6.设计jsp增删改查页面 7.连接各 ...