关闭 [安全开发生命周期(SDL)检查],并选择空项目
2.生成依赖性
选择 masm 依赖项并生成
(注意:若先创建了 asm 文件再生成依赖项,asm 文件是不会被汇编软件编译的!解决方案在最后!)
3.新建 asm 汇编文件
提醒:需要自己将 .cpp 改成 .asm
4.编写汇编语言
.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.在第一条语句打下断点,然后执行程序
6.在 调试->窗口->打开寄存器、内存、反汇编 之类的信息窗口(根据需要选择)
若没有这些选项,说明您没有(调试)运行程序 参照第五条
6.选择蓝圈中不同的执行方式,来调试您的汇编程序
提示:在上图左下 [寄存器] 显示框中,可右键选择您想显示的寄存器
结束
可能遇到问题的解决方案:(遇到其他问题,请留言,我会找解决方法)
一. asm 文件没有被编译
原因:若先创建了 asm 文件再生成依赖项,已创建的 asm 文件是不会被汇编软件编译的,已创建的 asm 文件的属性是不能被编译的属性
①打开 .asm 文件的的属性
②在常规中更改 项选项 位 Microsoft Macro Assembler
二. 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 实模式
推荐书籍:
《现代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