由于之前项目中某些密集运算优化的需要,涉及到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汇编...)