VS2015配置并运行汇编

〇、前言

在运行 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文件夹

例1:命令行输出,类似于printf(使用 MASM 的 StdOut 函数

.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

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值