使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第1张图片

1. 新建个 Visual C++ 的空项目

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第2张图片

关闭 [安全开发生命周期(SDL)检查],并选择空项目

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第3张图片

2.生成依赖性

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第4张图片

选择 masm 依赖项并生成 

注意:若先创建了 asm 文件再生成依赖项,asm 文件是不会被汇编软件编译的!解决方案在最后!


3.新建 asm 汇编文件

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第5张图片

4.编写汇编语言

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第6张图片

		.code			;代码段      !64 位没有 .model 宏指令,无法设置内存模型和生成的代码风格!
main proc				;main函数开始
	
	mov rax, 120
	add rax, 34
	sub rax, 130

	ret

main endp				;main函数结束
end
					;masm x64 没有指定入口点的宏指令!

关于 masm x64 没有指定入口点的宏指令 的问题,会在最后的参考博客中给出链接(国外论坛和微软官方的解答

5.将调试器位数换成 x64

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第7张图片

6.选择 项目->属性 [配置属性->连接器->高级[入口点   输入您想入口的函数名]]

4 步骤中的汇编代码,我用 main 当作入口函数,所以这里填入的是 main

若想让入口点为 a 函数,即下面贴的汇编代码,则在入口点处填个 a (表示 a 函数是程序的入口点)

		.code			;代码段     !64 位无法使用 .model 宏指定内存模型和生成的代码风格!
a proc				        ;a函数开始
	
	mov rax, 120
	add rax, 34
	sub rax, 130

	ret

a endp				        ;a函数结束
end

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第8张图片

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第9张图片

7.在第一条语句打下断点,然后执行程序

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第10张图片

8.在 调试->窗口->打开寄存器、内存、反汇编 之类的信息窗口(根据需要选择)

若没有这些选项,说明您没有(调试)运行程序 参照第七条

9.选择蓝圈中不同的执行方式,来调试您的汇编程序

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第11张图片

提示:在上图左下 [寄存器] 显示框中,可右键选择您想显示的寄存器

结束






可能遇到问题的解决方案:(遇到其他问题,请留言,我会找解决方法)

一. asm 文件没有被编译

 原因:若先创建了 asm 文件再生成依赖项,已创建的 asm 文件是不会被汇编软件编译的,已创建的 asm 文件的属性是不能被编译的属性

    ①打开 .asm 文件的的属性

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第12张图片

    ②在常规中更改 项选项 位 Microsoft Macro Assembler

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第13张图片


二. error LNK2005: main 已经在 a.obj 中定义

( main 是您定义的入口点函数,若是定义的入口点函数 a,则异常是 error LNK2005: main 已经在 *.obj 中定义)

    原因:在一个项目里定义了多个 asm 文件,并具有相同的入口函数

    解决方案1:用项目分割不同的 asm 文件

    解决方案2:不同的 asm 文件定义不同的函数入口点,运行相应汇编程序时,照着步骤六修改项目的程序入口点为相应文件的入口函数


三. 为什么我使用中断会触发异常

    原因:Windows10 上的程序是运行在 CPU 保护模式下的,在此模式下只能触发系统定义的软中断,无法触发硬中断,若想触发硬中断,请使用 DosBox 模拟 CPU 实模式

使用 Visual Studio 2017 写纯 64 位汇编(intel 风格)_第14张图片




推荐书籍:

《现代x86汇编语言程序设计》

汇编语言:基于x86处理器》


参考博文:

Visual Studio 2017 asm 高亮插件:

https://blog.csdn.net/sinat_27382047/article/details/70339455#comments

http://blog.csdn.net/maguanzhan7939/article/details/78608345

masm 宏定义规则:

https://msdn.microsoft.com/en-us/library/wxy1fb5k.aspx

关于 masm x64 没有指定入口点的宏指令 的问题:

https://docs.microsoft.com/zh-cn/cpp/assembler/masm/masm-for-x64-ml64-exe

https://social.msdn.microsoft.com/Forums/vstudio/en-US/2107f634-1152-4a85-ae48-0d580aaf3f02/why-does-64bit-masm-not-accept-an-entry-point-address-on-the-end-directive?forum=vcgeneral


推荐阅读:

使用 Visual Studio 2017 写纯 32 位汇编(intel 风格)

https://blog.csdn.net/alisebeast/article/details/79875393

你可能感兴趣的:(asm)