VS中使用X64汇编
需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地方来调用这些汇编代码。
那么,如何在VS中使用X64的汇编呢?本例子将演示如何在汇编文件中使用.c或者.cpp源文件中定义的函数和变量,以及如何在.c或者.cpp中使用汇编文件中定义的函数。
首先使用VS(本例子中使用的是VS2013)file=》new=》project,创建一个console项目如下:x64_asm。
        
        
项目创建好了之后,默认是一个X86的开发编译环境:

点击红框中的下拉箭头,选择Configure Manager…:
        
        
        
        
选择点击上图中的New:
        
        
选择上图中的x64,然后点击OK。这样,就将项目切换成了X64开发编译环境了:




然后,在项目中手动添加一个.asm文件,比如名称叫amd64xx.asm。
        
        
接着在VS左侧的项目名称下的Source Files上右键,选择add,existing item将该文件添加到source files中。
        
        
        
        
接下来,再添加一个func.cpp和func.h文件,在func.cpp里定义两个函数print1和print2,以及一个全局变量g_iValue,供amd64xx.asm中调用:
//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);
            
        __int
        
        }
        
        
        然后再来实现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等的基础。
项目代码:点击下载&提取码: 98z4

