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

 

posted on 2013-12-10 23:47  zcmmwbd  阅读(1529)  评论(6编辑  收藏  举报