x64内联汇编——VS2019

在64位系统中,不能使用_asm在.cpp或.c文件中直接编写内联汇编了,需要把汇编代码编写到.asm文件中,当.cpp或.c文件需要调用时再声明。

一、简单调用.asm文件中的汇编函数

1、创建空项目,在源文件中新建myAdd.asm文件,编写汇编代码。

.CODE

myAdd PROC
    add rcx,rdx
    mov rax,rcx
    ret
myAdd ENDP

END

 rcx,rdx中存放的是函数参数。

在x86-64架构的调用约定中,前四个整型参数会分别通过寄存器RCX、RDX、R8和R9来传递。

2、修改myAdd.asm文件的属性。

命令行:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

输出:$(IntDir)%(fileName).obj

3、在需要引入汇编子程序的.cpp文件中声明函数。

#include<Windows.h>

EXTERN_C DWORD myAdd(DWORD u1, DWORD u2);

4、注意!!!项目需要x64环境。

5、编写测试程序,运行。

二、在汇编函数中调用另一个汇编函数

1、在源文件中新建myAddOne.asm文件。

.CODE

myAddOne PROC
    add rcx, 1
    mov rax, rcx
    ret
myAddOne ENDP

END

2、修改myAddOne.asm文件属性(同上)。

3、修改myAdd.asm代码,在相加后调用myAddOne函数。

EXTERN myAddOne:PROC     ;引用外部函数

.CODE
myAdd PROC
    add rcx,rdx
    call myAddOne
    mov rax,rcx
    ret
myAdd ENDP
END

4、运行测试。

三、总结

命令行:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

输出:$(IntDir)%(fileName).obj

引入外部函数(c):EXTERN_C DWORD myAdd(DWORD u1, DWORD u2);

引入外部函数(asm):EXTERN myAddOne:PROC

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 64 位驱动程序编程中,内联汇编是不被推荐使用的方式。虽然在某些情况下允许使用内联汇编,但它可能会引入一些安全性和稳定性的风险,并且不利于代码的可维护性和可移植性。 以下是一些原因,为何使用内联汇编在 Windows 64 位驱动程序开发中不被推荐: 1. **安全性问题**:内联汇编可能会导致访问受限的特权指令或操作系统数据结构,这可能会破坏系统的安全性和稳定性。在驱动程序开发中,需要特别小心处理特权指令和操作系统数据。 2. **兼容性问题**:Windows 操作系统版本和体系结构的变化可能会导致内联汇编代码无法正常工作。为了确保驱动程序的兼容性,应该遵循官方支持的 API 和接口,并使用适当的系统调用。 3. **可移植性问题**:内联汇编通常依赖于特定的编译器、架构和平台。使用内联汇编可能会导致代码在不同的环境下无法移植,而且很难进行跨平台开发。 在 Windows 64 位驱动程序开发中,推荐使用面向对象的 C++ 编程语言,结合 Windows 驱动开发框架(如 WDM、WDF)来编写驱动代码。这样可以更好地利用框架提供的抽象层和API,保证驱动程序的安全性、兼容性和可移植性。 如果有必要使用汇编语言编写驱动程序,应该将汇编代码放在单独的汇编文件中,并通过调用机制与 C/C++ 代码进行交互。这样可以更好地管理和控制汇编代码的安全性和稳定性,并且提供了更好的可维护性和可移植性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值