在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项目中我们也可以采用这种方式实现混合式的接入方式 ...
随机推荐
- Android学习笔记01
一. 创建Activity的要点: 1.继承Activity类2.需要重写onCreate方法3.需要在AndroidManifest.xml注册4.为Activity添加控件和内容5.setCont ...
- TableViewCell的分割线显示不全解决方法
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath ...
- Python中将打印输出导向日志文件
a. 利用sys.stdout将print行导向到你定义的日志文件中,例如: import sys # make a copy of original stdout route stdout_back ...
- HTMLParser使用详解(3)- 通过Filter访问内容
HTMLParser遍历了网页的内容以后,以树(森林)结构保存了结果.HTMLParser访问结果内容的方法有两种.使用Filter和使用Visitor. (一)Filter类顾名思义,Filter就 ...
- ruby api 2.1新增改变
-> 这个符号可以替换lambda%i 生成符号数组 %i(foor bar baz) #[:foo,:bar:baz]def 定义方法 eg: def foo(x: 1); puts; end ...
- shell local
Shell函数定义的变量默认是global的,其作用域从"函数被调用时执行变量定义的地方"开始,到shell结束 http://blog.chinaunix.net/xmlrpc. ...
- Grid++Report的几点总结
一.同事解决方案: 1.在View文件夹下建立报表文件A,用来作为报表呈现的载体.这个页面负责加载报表模板与加载数据源.其中报表模板由于后缀名为grf,在MVC中不做任何修改的情况下,系统会做路由处理 ...
- C#下的Redis 学习
Redis作为世界上最快的分布式NoSQL的数据存储,在高性能构架中离不开他的身影 Centos下安装Redis wget http://download.redis.io/redis-stable. ...
- python 装饰器和 functools 模块
转自:http://blog.jkey.lu/2013/03/15/python-decorator-and-functools-module/ 什么是装饰器? 在 python 语言里第一次看到装饰 ...
- Django session 详解-part II-session
Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息.session的基础还是cookie,但是它提供了一些更加高级的功能.请看下面的一个例子: 使用 ...