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

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


关闭 [安全开发生命周期(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


Visual Studio中编写汇编代码可以使用内联汇编或者外部汇编文件的方式。下面我将分别介绍这两种方法。 1. 内联汇编: 在C/C++代码中嵌入汇编指令,使用内联汇编可以直接在源代码中混合使用汇编和高级语言的代码。下面是一个使用内联汇编的示例: ```c++ #include <iostream> int main() { int a = 5; int b = 10; int result; __asm { mov eax, a add eax, b mov result, eax } std::cout << "The result is: " << result << std::endl; return 0; } ``` 在上面的示例中,`__asm`关键字用于表示接下来的代码是汇编指令。可以使用汇编指令进行计算,并将结果保存在`result`变量中。 2. 外部汇编文件: 在Visual Studio中,您也可以将汇编代码保存在单独的外部文件中,并与C/C++代码进行链接。下面是一个使用外部汇编文件的示例: 首先,创建一个名为`assembly.asm`的文件,并编写以下示例汇编代码: ```assembly .model flat, c .code add_numbers proc mov eax, 5 add eax, 10 ret add_numbers endp end ``` 然后,在C/C++代码中调用外部汇编函数: ```c++ #include <iostream> extern "C" int add_numbers(); int main() { int result = add_numbers(); std::cout << "The result is: " << result << std::endl; return 0; } ``` 上述示例中,使用`extern "C"`关键字表示编译器应该按照C语言的调用约定来调用外部函数。 无论是内联汇编还是外部汇编文件,您都可以使用Visual Studio来构建和调试带有汇编代码的项目。请确保在项目属性中设置正确的构建选项和路径,并将汇编文件正确地包含到项目中。 希望这些信息对您有所帮助!如有任何疑问,请随时提问。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值