由於之前項目中某些密集運算優化的需要,涉及到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匯編...)