64位内联汇编

在项目里新建一个asm文件,选择该文件然后右键属性,做如下配置,点击应用
在这里插入图片描述

接下来选择自定义生成工具-》常规
在命令行内输入:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm
输出:$(IntDir)%(fileName).obj;%(Outputs)

在源文件里面添加一个demo.asm,导出一个函数 Reboot

public Reboot

.code
	Reboot:
	mov al,0feh
	out 64h,al
	ret

end

在需要使用此函数的文件中加上 .c文件 extern VOID Reboot(); cpp文件 extern “C” VOID Reboot();

#include<ntddk.h>

//此源文件是.cpp
extern "C" VOID  Reboot();

//此源文件是.c
extern  VOID  Reboot();

VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
#if _AMD64_ 
	Reboot();
#endif
	KdPrint(("驱动卸载成功\n"));
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
	NTSTATUS status =STATUS_SUCCESS;
	pDriverObject->DriverUnload=DriverUnload;
	KdPrint(("驱动加载成功\n"));
	return status;

}

X64汇编基本语法

头文件导出函数

#pragma once 
extern "C"
{
	int _stdcall func1();
	void _stdcall func2();
	__int64 g_value = 10;
	void print2();
}

void print2()
{

	printf("函数被调用\n");
}

.asm文件

EXTERN print2:PROC;引用外部函数
EXTERN g_value:DQ;引用外部变量

.DATA 
val1 DQ ?;自己定义变量

.CODE

SAVE_ALL_REGISTERS MACRO  ;定义宏
		push r15
		push r14
		push r13
		push r12
		push r11
		push r10
		push r9
		push r8
		push rax
		push rcx
		push rbx
		push rdx
		push rbp
		push rsp
		push rsi
		push rdi

ENDM

RESUME_ALL_REGISTERS MACRO  ;定义宏

		pop rdi
		pop rsi
		pop rsp
		pop rbp
		pop rdx
		pop rbx
		pop rcx
		pop rax
		pop r8
		pop r9
		pop r10
		pop r11
		pop r12
		pop r13
		pop r14
		pop r15
ENDM


func1 PROC
mov r10,g_value	;使用外部变量
add r10,99
mov rax,r10
ret 	;不加ret会直接运行func2
func1 ENDP


func2 PROC
CALL print2;调用外部函数
ret

func2 ENDP

END

.app文件里调用汇编文件的函数,汇编文件也调用了头文件里面的函数

void _tmain()
{
	printf("a=%d",func1());
	func2();
	getchar();
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值