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,21CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,79,203,1DEFPUSHBUTTON "退出",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,lParammov eax,wMsg.if eax == WM_CLOSEinvoke EndDialog,hWnd,NULL.elseif eax == WM_INITDIALOG;invoke LoadIcon,hInstance,ICO_MAIN;incoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax .elseif eax == WM_COMMANDmov eax,wParam.if ax == IDOKinvoke EndDialog,hWnd,NULL.endif.elsemov eax,FALSEret.endifmov eax,TRUEret _ProcDlgHelloworld endpstart:invoke GetModuleHandle,NULLmov hInstance,eax; 弹出对话框,对话框与及处理过程在这里绑定 invoke DialogBoxParam,hInstance,DLG_HELLOWORLD,NULL,offset _ProcDlgHelloworld,NULLinvoke 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 *.objdel *.res
编译运行如下(每次修改相当于只需要执行nmake一条命令操作简单多了):
参考:
Windows环境下32位汇编语言程序设计
转载于:https://www.cnblogs.com/lsdb/p/7402955.html
Win32汇编环境搭建教程(MASM32 SDK)相关推荐
- win命令安装 安装cmake_win10下VSCode+CMake+Clang+GCC环境搭建教程图解
打算用C/C++把基本的数据结构与算法实现一遍, 为考研做准备, 因为只是想实现算法和数据结构, 就不太想用VisualStudio, 感觉VSCode不错, 遂在网上找了一些教程, 结合自己的需求, ...
- eclipse--android开发环境搭建教程
引言 在windows安装Android的开发环境不简单也说不上算复杂,但由于国内无法正常访问google给android开发环境搭建带来不小的麻烦.现将本人搭建过程记录如下,希望会对投身androi ...
- (一)phoneGap之环境搭建教程及其example分析
phoneGap之环境搭建教程及其example分析 一.环境搭建 与普通的开发android应用一样,phoneGap也同于原生android应用一样,环境相同,只是有部分不同,下面就我做理解,进行 ...
- 五部搞定Android开发环境部署——费UC噶不过详细的Android开发环境搭建教程
五步搞定Android开发环境部署--非常详细的Android开发环境搭建教程 引言 在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立 ...
- LVGL WIN32模拟器环境搭建
LVGL WIN32模拟器环境搭建 LVGL简介 环境搭建 IDE 选择 模拟器代码下载 PC模拟器搭建 其他配置项说明 LVGL简介 LVGL是一个跨平台.轻量级.易于移植的图形库.因其支持大量特性 ...
- Arduino框架下联盛德W801开发环境搭建教程
Arduino框架下联盛德W801开发环境搭建教程 联盛德W801拥有自己的SDK集成开发工具,能做到这一点非常令人敬佩和了不起.国内好多芯片厂商都需要依托第三方开发工具集来实现对自己产品的开发.多元 ...
- 虚拟机IOS开发环境搭建教程
来源:http://www.cnblogs.com/xiaoyaoju/archive/2013/05/21/3091171.html 安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB ...
- IOS开发学习 IDE环境搭建教程
IOS开发学习 IDE环境搭建教程是本文要介绍的内容,在坛子里逛了一圈,发现一篇好的文章,与友们分享一下,要有耐心的看整个过程,不多说,直接进入话题. 安装条件: 硬件:一台拥有支持虚拟技术的64位双 ...
- Android资源总结(开发工具/环境搭建/教程/论坛/博客/反编译工具)
Android资源总结(开发工具/环境搭建/教程/论坛/博客/反编译工具) 在Android发展前景相当好的情况下,本人最近搜集了一些关于Android的相关资源,当然包含以前发布的博客内容,进行了一 ...
最新文章
- 第31届NIPS正式开幕,3240篇提交论文创历史新高,公布3篇最佳论文
- 数据不平衡、不平衡采样、调整分类阈值、过采样、欠采样、SMOTE、EasyEnsemble、加入数据平衡的流程、代价敏感学习BalanceCascade、
- Leaflet中使用markerCluster实现点聚合效果
- c ++一行给多个变量赋值_C语言变量
- iNeuOS云操作系统,.NET Core全系打造
- simbert文本相似度,短文本语义匹配模型
- JavaWeb 后端 三 之 Response Request 学习笔记
- 【翻译】使用PowerShell获取网站运行时数据
- 「mac基础知识」mac上将Keynote设置为使用iCloud的方法
- 浅谈RSTP的快速收敛机制 P/A机制
- basic语言基础 chm_拒付论文装订费错失博士学位,C语言之父毕业论文丢失52年重见天日...
- 推荐一款好用的Web端JSON在线编辑器svelte-jsoneditor
- 线性调频信号及仿真[python]
- 网络规划设计师教程知识点精讲之计算机网络分类
- VTK:线宽用法实战
- 【Elasticsearch教程8】Mapping字段类型之keyword
- centos7利用libreoffice将doc文件转换为pdf
- 双屏计算机主机是什么,电脑双屏显示有人知道关于一个主机两个显示器的问题吗 爱问知识人...
- ps制作html网页的跳转,PS图片转页面CSS+HTML的步骤
- 一口气从零读懂CAN总线以及应用
热门文章
- Why Spring Boot
- SpringBoot+Spring Security验证密码MD5加密
- Android --- Retrofit 之 Okhttp3 网络请求总是调用 onFailure 方法,而不调用 onResponse,报错 timeout。
- linux重定向进程输出到文件删除,Linux文件编辑器vim输出输入重定向、管道以及进程(示例代码)...
- css+图标偏移,css background-position 偏移的问题
- 通达oa与mysql集成_安装通达OA后想使用其自带的Mysql数据库的解决方法
- filesaver.js 保存文件路径_iOS把UIImage保存到沙盒目录下以及沙盒目录概述
- 但凡网络工程师会这个技能,也不至于天天抱怨工资低
- Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式、清除原有图像、设置横坐标显示文字/旋转角度、添加图例、绘图布局自动调整、图像显示、图像暂停)
- 编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略