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

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

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

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

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

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

2.生成依赖性

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

选择 masm 依赖项并生成 

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

3.新建 asm 汇编文件

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

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

提醒:需要自己将 .cpp 改成 .asm

4.编写汇编语言

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

		.model flat, stdcall	;定义使用的内存模型和生成的代码风格
		.code			;标识代码段
main proc				;标识main函数开始
	
	mov eax, 0
	add eax, 34
	sub eax, 19
	
	ret                             ;类似 C 语言中的 return , 跳转到 esp 指向的内存地址,并保存 eax 的值
main endp				;标识main函数结束
end main				;指定程序入口点是main函数

就如字面上的意思,由于 end 可以指定程序入口函数,所以可以由下面的一段代码代替上面的:

		.model flat, stdcall	;定义使用的内存模型和生成的代码风格
		.code			;标识代码段
a proc					;标识a函数开始
	
	mov eax, 0
	add eax, 34
	sub eax, 19
	
	ret                             ;类似 C 语言中的 return , 跳转到 esp 指向的内存地址,并保存 eax 的值
					;此处会调转到系统调用处
a endp					;标识a函数结束
end a					;指定程序入口点是a函数

所以大家应该明白,在 masm x32 汇编中,入口点是由 end 函数名 指定的

注意:汇编程序结束的时候,esp 指向的位置必须是和程序开始时一致(以正确跳转会系统调用点)

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

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

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

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

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

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

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

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

结束






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

一. asm 文件没有被编译

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

    ①打开 .asm 文件的的属性

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

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

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


二. error LNK2005: _main@0 已经在 a.obj 中定义

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

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

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

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

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


    无效解决方案:不同的 asm 文件定义不同的函数入口点,系统将会随机调用某个 asm 文件的入口函数,另一个不会调用,故无法使用此方法


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

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

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





推荐书籍:

《现代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


推荐阅读:

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

https://blog.csdn.net/Alisebeast/article/details/79875620


你可能感兴趣的:(asm)