在Symbian应用里嵌入汇编代码

 在Symbian应用里嵌入汇编代码

 

    在Symbian应用里嵌入汇编代码"Symbian手机一般用的都是ARM的CPU(当然也有xscale或者其他的),所以都支持通用的汇编指令,我们可以通过加入汇编指令Source到代码里面,就能直接执行特殊指令并操作各种寄存器,使得程序能实现一些特殊的功能。
SYMBIAN应用的开发都是C/C++的程序,已经封装了大部分需要的功能。为了加快运行速度和实现一些特殊功能,我们可以使用汇编

来写一些子函数。ARM汇编优化后一般能达到原来C/C++代码的30%以上(当然最优先的优化是在框架级别进行调整,在逻辑上最优后

再考虑用汇编重写代码会更有效优化性能),最快的能提高几倍,所以对一些性能要求比较高的,应该通过汇编来实现。

这里我举个简单的setjump.S的汇编例子.
首先,在src目录下增加一个setjump.S的文件。然后写上如下的汇编代码。

CODE:
.text
.global GetCpuId
.global setjmp
.global longjmp

setjmp:
mov r12,#0
stmia r0,{r4-r12,sp,lr}
mov r0,#0
mov pc,lr

longjmp:
ldmia r0!,{r4-r12,sp,lr}
movs r0,r1
moveq r0,#1
mov pc,lr

GetCpuId:
mrs r0,cpsr
and r0,r0,#15
cmp r0,#15
bne UserMode
mrc p15,0,r0,c0,c0,0
nop
nop
mrc p15,0,r2,c0,c0,1
nop
nop
str r0,[r1,#0]
str r2,[r1,#4]
UserMode:
...

然后,在其他需要用到jump函数的C/C++程序中,增加对它使用的代码:

CODE:
extern "C"{ //for C++ only
int setjmp(unsigned long *__jmp);
void longjmp(unsigned long *__jmp, int __ret);
}

汇编写出来的都是C语言的函数,声明后直接调用函数即可:
CODE:
setjmp(data->jmpbuf);
...
longjmp(data->jmpbuf, 1);

完成代码后把.s文件保存到Source目录下,并修改MMP文件,加入SOURCE setjump.s(9.0后的Symbian编译器能够自动识别汇编还是

C/C++文件,记得以前是需要手工编译成独立的库的):

CODE:
SOURCE setjump.s

这个代码只能是在gcce/armi环境下来跑,模拟器上是不行的,所以请在MMP上用编译宏分割开,#ifdef MARM ...#endif等。X86上

需要再写一段for PC的汇编才行。

ARM CPU的版本不同,支持汇编的指令也不同,所以很可能必须对不同的CPU做不同的汇编代码以达到最佳性能或者执行效果。

  • 0
    点赞
  • 0
    收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值