一、说明

常用的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. Shell中的IFS

    一.IFS 介绍 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.完整定义是The shell uses the value stored in ...

  2. Jmeter 二次开发 将CSV Data Set Config添加从哪一行开始读数据

    经常遇到性能测试的时候,有100万条数据,才用了5万条,中途因为某些原因停止了,继续用的时候, 要么要清除DB中数据,要么要清除数据源中的数据, 觉得特别麻烦, 希望改写下代码,将 Ignore fi ...

  3. eclipse中.project文件和.classpath文件详解

    一.概述.project是项目文件,项目的结构都在其中定义,比如lib的位置,src的位置,classes的位置..classpath的位置定义了你这个项目在编译时所使用的$CLASSPATH. 二. ...

  4. PHP直接将文件流转换为字符串

    有时候不需要图片直接输出到浏览器,需要如下处理! 输出到浏览器 $qrCode = new QrCode(); $qrCode ->setText('Life is too short to b ...

  5. idea 启动时报 error:java 无效的源发行版

    说白了就是编译的版本不符合,有的地方是jdk1.7 有的地方是jdk1.8 所以你只要每个地方都保持一致就行. 每个地方!! 每个地方!! 每个地方!! 重要的设置说三遍! 以jdk1.7为例 fil ...

  6. VC.时间(网页内容收集)

    1.VC++获得当前系统时间的几种方案_记忆53秒_新浪博客.html(http://blog.sina.com.cn/s/blog_676271a60101i0hb.html) 1.1.内容保存: ...

  7. link和@import区别

    推荐使用:link 区别 1.从属关系区别@import是 CSS 提供的语法规则,只有导入样式表的作用:link是HTML提供的标签,不仅可以加载 CSS 文件,还可以定义 RSS.rel 连接属性 ...

  8. dataway_代码规范

    无论何时无论何地,只要写代码,请遵从这样的规范. ----------------------------------------------------------------- css代码规范. ...

  9. Python全栈开发-Day9-线程/GIL/事件/队列

    本节内容 进程与线程的概念 Python threading 模块 GIL——global interpreter lock Mutex互斥锁(线程锁) Semaphore信号量 Events事件 Q ...

  10. (转)C# Textbox的ImeMode取值对中文输入法的影响

    取值 五笔加加 微软拼音3.0 搜狗拼音 说明 NoControl 首次调出后按一次ctrl+space才能正确使用 中西标点或全半角字符继承上次设置 调出后默认为英文输入状态  调出后默认为西文标点 ...