1. 程式人生 > >第五章:VS中使用X64彙編

第五章: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);

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