在WP8項目中使用ARMASM



由於之前項目中某些密集運算優化的需要,涉及到ARMASM相關的內容, 所以有幸可以在此分享一下自己的經驗。

 

先鋪墊一些知識:

1. ARM處理器有兩種指令ARM、THUMB, 在WP8下默認是THUMB。

2. 就我所知,ARM匯編常見有兩種語法GCC語法和ARM官方語法, ARMASM.exe(WP8 SDK提供)遵循ARM官方語法標准。

3. WP8設備使用ARM架構,芯片為高通S4或更高, 所以WP8的所有設備都有NEON協處理器(類似x86的MMX), 這對多媒體應用等運算密集的性能提升有很大幫助。

 

一般用法:

1. 編寫armasm的匯編程序, 導出相關函數, 使用armasm編譯出obj后使用lib.exe導出為lib。

2. 編寫C、C++代碼鏈接前一步生成的lib提供上層調用。

 

ARMASM語法簡單介紹(僅介紹本文會用到的部分):

1. 除label頂格以外, 其他代碼不允許頂格。

2. AREA: 分節。 e.g. AREA .text,CODE,THUMB

3. ALIGN: 代碼對齊。

4. EXPORT: 導出符號。

5. END: 源碼結束標記。

6. 傳參規則: 1~4個參數由r0~r3寄存器傳參, 大於4個的從右到左入棧, 返回值存放於r0。

7. 分號是行注釋。

 

實例:

合格的C、C++程序員應該對編譯原理相當熟悉了, 基本之需要學習一下ARMASM語法就可以開工。 

回到正題, 首先看看SDK給我們提供了什么樣的配套工具, 在\Microsoft Visual Studio 2012\Visual Studio Tools中可以看到有一個“Visual Studio 2012 ARM Phone 工具命令提示”。這個命令行環境可以編譯供WP8使用的本地代碼。 你可以在這個命令行環境下編譯出供WP8使用的EXE,DLL,LIB etc。 本次我們僅使用armasm.exe和lib.exe。

 

實例的目標是實現一個用armasm做的加法函數, 以下是代碼:

arm_func.s

    AREA .text,CODE,THUMB ; 必須為THUMB, 否則調用時會引發非法指令集的異常
    EXPORT asm_add ;導出asm_add符號

asm_add
    add r0, r1  ; 參數2加參數1的結果作為返回值
    bx lr ; 返回
    END

編譯匯編文件: 

D:\Temp>armasm arm_func.s
Microsoft (R) ARM Macro Assembler Version 11.00.60610.1
Copyright (C) Microsoft Corporation.  All rights reserved.

D:\Temp>lib arm_func.obj
Microsoft (R) Library Manager Version 11.00.60610.1
Copyright (C) Microsoft Corporation.  All rights reserved.

D:\Temp>dir *.lib
 驅動器 D 中的卷沒有標簽。
 卷的序列號是 0206-86B3

 D:\Temp 的目錄

2013/12/10  23:18               618 arm_func.lib
               1 個文件            618 字節
               0 個目錄  3,495,227,392 可用字節

 


 arm_func.h

#ifdef __cplusplus
extern "C"
{
#endif
    int asm_add(int num1, int num2);
#ifdef __cplusplus
};
#endif

test.cpp

#include "arm_func.h"
#pragma comment(lib, "arm_func.lib")

void TestFunc()
{
  if (asm_add(1, 2) == 3)   OutputDebugString(L
"correct!");
  else
    OutputDebugString(L"incrrect");
}


 

大概就是這樣了。。。

P.S. 以上代碼沒有測試過, 僅僅是介紹個思路. (因為我搞這個的時候沒找到啥有價值的資料, 就靠自己摸索來着, 好在懂點x86匯編...)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM