在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项目中我们也可以采用这种方式实现混合式的接入方式 ...
随机推荐
- 每个程序员都需要学习 JavaScript 的7个理由
最近在和招聘经理交流现在找一个好的程序员有多难的时候,我渐渐意识到了现在编程语言越来越倾重于JavaScript.Web开发人员尤其如此.所以,如果你是一个程序员,那么你应该去学习JavaScript ...
- JavaScript【面向对象】-静态方法-私有方法-公有方法-特权方法
JavaScript面向对象是近年来比较火的一个概念了,由于小弟才疏学浅,虽然做过不少的web项目,看了网上很多深奥的资料和教程,还是对他们深奥 的理论一知半解,前段时间看了点书,总算有了自己的理解, ...
- Liferay 6开发学习(二十六):数据库连接相关问题
Liferay中怎么更换数据库? 常碰到有人问Liferay怎么更换数据库,怎么修改数据库连接.在我们第一次启动Liferay的时候,会有一个配置向导,在此配置向导我们可以选择数据库,并配置数据库连接 ...
- 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)
先简单介绍一下项目吧,我们这个项目是用VS2003开发的,老早一个项目.WEB前端机+业务处理(WebService层)+数据库分别布置在不同的计算机上. 现在老总有一个需求,要统计出每个页面的执行时 ...
- HTTP gzip和deflate的几点区别
gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分:deflate是一种压缩算法,是huffman编码的一种加强. deflate与gzip解压的代码几乎相同,可以合成一块代码 ...
- Servlet中的cookie和session
保存数据的2中方式 Cookie Session Cookie 我们可以将一些信息保存到cookie中,cookie存放在对应的浏览器目录里面.每个站点可以保存20个cookie,最大长度不超过4k. ...
- menu({postion:{my:"left top"},at:"right bottom"})里的my与at会冲突吗
my(默认值:"center")类型:String描述:定义被定位元素上对准目标元素的位置:"horizontal vertical" 对齐方式.一个单一的值, ...
- javascript自执行匿名函数
1)自执行匿名函数: 常见格式:(function() { /* code */ })(); 2)作用: function中的code代码在解释时就已经在运行了.因此可以用它创建命名空间, ...
- ubuntu 14.10 安装 zabbix
在ubuntu 14.10 上部署 zabbix 2.x 基本软件包安装 既然是ubuntu系统,当然要用好apt-get神器. 参考教程 URL:http://blog.csdn.net/cloud ...
- iOS中使用FMDB事务批量更新数据库
今天比较闲看到大家在群里讨论关于数据库操作的问题,其中谈到了"事务"这个词,坦白讲虽然作为计算机专业的学生,在上学的时候确实知道存储过程.触发器.事务等等这些名词的概念,但是由于毕 ...