在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(, ) == 3)
OutputDebugString(L"correct!");
else
OutputDebugString(L"incrrect");
}
大概就是这样了。。。
P.S. 以上代码没有测试过, 仅仅是介绍个思路. (因为我搞这个的时候没找到啥有价值的资料, 就靠自己摸索来着, 好在懂点x86汇编...)
在WP8项目中使用ARMASM的更多相关文章
- Unity5.x在WP8.1中无法使用Reflection API的解决方法
下班前随便写点,虽然花了不少时间但是最终得到的解决方法还是比较简单的. 第一种方法:使用WinRTLegacy.dll中的类.这个dll在生成的WP project中是自带的无需在unity工程中添加 ...
- 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图
[Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...
- VS项目中使用Nuget还原包后编译生产还一直报错?
Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...
- ABP项目中使用Swagger生成动态WebAPI
本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...
- iOS 之项目中遇到的问题总结
昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...
- My97DatePicker时间控件在项目中的应用
一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...
- 在项目中同时使用Objective-C和Swift
苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
随机推荐
- git 常用命令 (git did not exit cleanly)
Git常用操作命令收集: git clonegit git remote -v git remote add [name] [url] git remote rm [name] git remote ...
- JAVA CAS原理深度分析
参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/reso ...
- RightBarButon
//rightBar button UIButton *rightButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 34, 34)]; ...
- Python进阶01 词典
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 基础教程介绍了基本概念,特别是对象和类. 进阶教程对基础教程的进一步拓展,说明Py ...
- mysql 用户权限设置【转】
在Linux下phpStudy集成开发环境中,要先进入mysql下bin目录,执行mysql ./mysql -u root -p 1.创建新用户 通过root用户登录之后创建 >> gr ...
- EasyUI-datagrid-自动合并单元格(转)
1.目标 1.1表格初始化完成后,已经自动合并好需要合并的行: 1.2当点击字段排序后,重新进行合并: 2.实现 2.1 引入插件 /** * author ____′↘夏悸 * create dat ...
- mysql 使用说明-2
3.3.4 Retrieving Information from a Table Select 命令从表格中取回信息 SELECT what_to_select FROM which_table W ...
- Xcode去除某种类型的警告
首先来看下当有警告时,怎么找到警告类型,在某条警告上,右键—>Reveal in Log 下面 [ ] 中间就是警告信息 去除警告信息的几种方式: 一.使用编译器提供的宏 ...
- 学习练习 java 小题
Scanner a = new Scanner(System.in); System.out.println("请输入您的分数"); int fen = a.nextInt(); ...
- 洛谷P1214 [USACO1.4]等差数列 Arithmetic Progressions
P1214 [USACO1.4]等差数列 Arithmetic Progressions• o 156通过o 463提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题 ...