在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做不同的汇编代码以达到最佳性能或者执行效果。