在项目里新建一个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();
}