VS中使用X64汇编

须要注意的是,在X86项目中,能够使用__asm{}来嵌入汇编代码,可是在X64项目中,不再能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,而后在其它地方来调用这些汇编代码。编程

 

那么,如何在VS中使用X64的汇编呢?本例子将演示如何在汇编文件中使用.c或者.cpp源文件中定义的函数和变量,以及如何在.c或者.cpp中使用汇编文件中定义的函数。函数

 

首先使用VS(本例子中使用的是VS2013)file=》new=》project,建立一个console项目以下:x64_asm。学习

项目建立好了以后,默认是一个X86的开发编译环境:ui

                         

点击红框中的下拉箭头,选择Configure Manager…:spa

选择点击上图中的New:blog

选择上图中的x64,而后点击OK。这样,就将项目切换成了X64开发编译环境了:开发

                                     

而后,在项目中手动添加一个.asm文件,好比名称叫amd64xx.asm。get

接着在VS左侧的项目名称下的Source Files上右键,选择add,existing item将该文件添加到source files中。it

 

 

接下来,再添加一个func.cpp和func.h文件,在func.cpp里定义两个函数print1和print2,以及一个全局变量g_iValue,供amd64xx.asm中调用:console

//func.cpp

#include "stdafx.h"

#include "func.h"

 

void print1(void)

{

    printf("hello world1\n");

}

 

void print2(void)

{

    printf("hello world2\n");

}

//func.h

#pragma once

extern "C"//防止函数被name mangling

{

 

    void print1(void);

    void print2(void);

    __int64 g_iValue =100;

}

 

而后再来实现amd64xx.asm以下。在amd64xx.asm中,实现了2个函数,声明在amd64xx.h中,而且引用了func.cpp中定义的print2和g_ivalue。

//amd64xx.h

extern "C" int __stdcall func1();

extern "C" void __stdcall func2();

 

//amd64xx.asm

EXTERN  print2:PROC;引用外部函数

EXTERN  g_iValue:DQ;引用外部变量

 

.DATA

 

val1 DQ ?;本身定义变量

 

.CODE

 

func1 PROC

 

mov r10, g_iValue;使用func.h中的外部变量

mov val1,r10;使用自定义变量

mov rax,val1

ret;若是不返回,那么会继续执行func2

FUNC1 ENDP

 

func2 PROC

CALL print2 ;调用func.cpp中的外部函数

ret

FUNC2 ENDP

END

 

编译amd64xx.asm须要作单独的设置:

在amd64xx.asm文件上单击鼠标右键,选择“属性(properties)”:

在Excluded From Build中选择No

在Item Type中选择Custom Build Tool

而后点击肯定。

再次右键打开amd64xx.asm的properties属性:

这个时候会看见一个Custome Build Tool的选项,以下:

在Command Line处输入:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

在Outputs处输入:$(IntDir)%(fileName).obj;%(Outputs)

而后点击肯定。

 

最后在x64_asm.cpp的main函数里调用amd64xx.asm中的func1和func2:

 

//x64_asm.cpp

#include "stdafx.h"

#include "amd64xx.h"

 

int _tmain(int argc, _TCHAR* argv[])

{

    printf("%d\n",func1());//amd64xx.asm中定义的func1

    func2();//amd64xx.asm中定义的func2

    return 0;

}

最后在项目名称上右键,选择build编译项目:

若是没有报错,那么就能够直接运行程序了:

 

 

此种方法,是学习Windows内核X64驱动,VT等的基础。

 

项目代码:点击下载

相关文章
相关标签/搜索