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等的基礎。

 

項目代碼:點擊下載

相關文章
相關標籤/搜索