在运行 Microsoft Windows 的 x86 系统中,其他一些有名的汇编器包括:TASM(Turbo 汇编器),NASM(Netwide 汇编器)和 MASM32(MASM 的一种变体)。GAS(GNU 汇编器)和 NASM 是两种基于 Linux 的汇编器。在这些汇编器中,NASM 的语法与 MASM 的最相似。汇编语言是最古老的编程语言,在所有的语言中,它与原生机器语言最为接近。它能直接访问计算机硬件,要求用户了解计算机架构和操作系统。
什么是汇编器和链接器?
汇编器(assembler)是一种工具程序,用于将汇编语言源程序转换为机器语言。链接器(linker)也是一种工具程序,它把汇编器生成的单个文件组合为一个可执行程序。还有一个相关的工具,称为调试器(debugger),使程序员可以在程序运行时,单步执行程序并检查寄存器和内存状态。
MASM 能创建哪些类型的程序?
32 位保护模式(32-Bit Protected Mode)(地址空间为4Gb):32 位保护模式程序运行于所有的 32 位和 64 位版本的 Microsoft Windows 系统。它们通常比实模式程序更容易编写和理解。从现在开始,将其简称为 32 位模式。 64 位模式(64-Bit Mode):64 位程序运行于所有的 64 位版本 Microsoft Windows 系统。 16 位实地址模式(16-Bit Real-Address Mode)(地址空间为64kb):16 位程序运行于 32 位版本 Windows 和嵌入式系统。 64 位 Windows 不支持这类程序。
一、建项目1.建一个空项目,必须先建空项目,改现成的C++项目为assembler项目可能会造成编译不过.
2.选中项目右键 “生成自定义”,选择MASM生成规则.
3.选中源文件右键-》添加-》新建项
此处后缀名是汇编的.asm
4.选中项目右键-》属性-》链接器-》系统-》 子系统选 “控制台(SUBSYSTEM:CONSOLE)”
5.选中项目右键-》属性-》链接器-》高级-》 入口点 填 "main"
(可以看到,如果安装了高亮插件,不仅注释可以用了,代码也有高亮提示了,后面介绍)
最后,输出,调试时选择菜单 调试-》窗口-》寄存器 就能看到寄存器值。(这样,就不至于苦逼地用指令-ip一步步看了吧~)
vs2015的汇编语法高亮插件1(AsmDude)
在VS2015 工具->扩展和更新->选择联机->搜索AsmDude,然后安装就行了。该插件实现汇编语法高亮和提示。
高亮插件2(AsmHighlighter)
链接:https://pan.baidu.com/s/15Ifv-Vv1h8DSAeg57ljLLQ 提取码:sr5o
安装前先把VS2015的 “自动检查更新” 和 “自动检查扩展” 关掉,位置在 工具 | 选项 | 扩展和更新 页。
注意: 如果安装后没有高亮源代码显示 关闭VS然后从注册表中删除下面的项 VS2015: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\FontAndColors\Cache
TITLE Add and Subtract (AddSub.asm)
; This program adds and subtracts 32-bit integers.
; Last update: 2/1/02
INCLUDELIB kernel32.lib
.MODEL flat,stdcall
;.code
ExitProcess PROTO, ; exit program
dwExitCode:DWORD ; return code
.data
.code
main PROC
mov eax,10000h ; EAX = 10000h
add eax,40000h ; EAX = 50000h
sub eax,20000h ; EAX = 30000h
push 0h
call ExitProcess
main ENDP
END main
在调试时可以自定义调试接口。例如,如果想要显示 CPU 寄存器,实现方法是,在 Debug 菜单中选择 Windows,然后再选择 Registers, 其中 Registers 窗口可见,同时还关闭了一些不重要的窗口。EAX 数值显示为 0000000B,是十进制数 11 的十六进制表示。 Registers 窗口中,EFL (Extend Flags)寄存器包含了所有的状态标志位(零标志、进位标志、溢出标志等)。如果在 Registers 窗口中 右键单击,并在弹出菜单中选择Flags,则窗口将显示单个的标志位值。 Registers 窗口的一个重要特点是,在单步执行程序时,任何寄存器,只要当前指令修改了它的数值,就会变为红色。尽管无法在打印页面(它只有黑白两色)上表示出来,这种红色高亮确实显示给程序员,使之了解其程序是怎样影响寄存器的。 在 Visual Studio 中运行一个汇编语言程序时,它是在控制台窗口中启动的。这个窗口与从 Windows 的 Start 菜单运行名为 cmd.exe 程序的窗口是相同的。或者,还可以打开项目 Debug\Bin 文件夹中的命令提示符,直接从命令行运行应用程序。如果采用的是这个方法,程序员就只能看见程序的输出,其中包括了写入控制台窗口的文本。查找具有相同名称的可执行文件作为 Visual Studio 项目。
备注:如果需要使用系统库函数,还需要进行如下配置:
下载一个masm(官网:http://www.masm32.com/download.htm)在masm的安装目录中找到include文件夹和lib文件夹
在VS项目中配置 在这里添加你的masm的include文件夹
配置lib 链接器-通用-附加库目录 在这里添加你的masm的lib文件夹
.386
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
include masm32.inc
includelib kernel32.lib
includelib masm32.lib
.data
HelloWorld db "Hello World!", 0
.code
main:
invoke StdOut, addr HelloWorld
invoke ExitProcess, 0
end main
例2:messagebox(使用系统API)
;--------------------------------------
; 功能 汇编程序1 来自window PE 权威指南
;--------------------------------------
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;数据段
.data
szText db 'HelloWorld',0
;代码段
.code
main:
invoke MessageBox,NULL,offset szText,NULL,MB_OK
invoke ExitProcess,NULL
end main
使用微软 C 标准库 msvcrt.dll 中的 printf 函数.
; Test3_3.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szText db 'Hello World!', 0
.code
main:
invoke crt_printf, addr szText
ret
end main