在BlackBerry PlayBook NDK 开发中嵌入ARM汇编语句


在BlackBerry PlayBook NDK开发中使用的是c和c++,都是编译后执行。在特殊情况下如果有需要使用汇编的话,也可以在使用c或者是c++的过程中嵌入汇编语句。

因为PlayBook使用的是ARM的CPU所以使用的汇编也就是ARM的汇编了。

之前在学习BeagleBoard上的QNX编程时也做过类似的实验,在c程序中嵌入使用ARM汇编语句。总结出来的结果是将ARM汇编独立到一个.S文件中会比较方便,更多的细节请参考。( 与)

为了测试ARM汇编,在测试过程中就不能使用模拟器了,因为PlayBook 模拟器其实使用的是X86架构,不是ARM架构。

启动PlayBook NDK 开发环境,连接好PlayBook真机,就可以开始测试了。

在PlayBook NDK中新建一个BlackBerry Tablet OS c/c++项目,语言选择c,类型选择“Empty Application”,就是一个空的c项目。

然后在src目录中创建一个main.c源文件,将以下代码拷贝到main.c文件中:

  1. #include <stdlib.h>   
  2. #include <stdio.h>   
  3.   
  4. extern void damonfunction(int data);  
  5.   
  6. long t;  
  7.   
  8. void printResult(){  
  9.  printf ("t is: %d now \n",t);  
  10.  }  
  11.   
  12. int main(int argc, char *argv[]) {  
  13.   
  14.  t=10;  
  15.  printResult();  
  16.  damonfunction(&t);  
  17.   
  18.  printResult();  
  19.   
  20.  return EXIT_SUCCESS;  
  21. }  

然后在src目录下创建一个汇编文件,以.S为后缀,文件名没有要求,我使用的是MyASM.S

然后将以下代码拷贝到MyASM.S文件中:

  1. .section .text  
  2. .globl damonfunction  
  3. damonfunction:  
  4. @现场保存  
  5. mov ip,sp  
  6. sub sp,sp, #12  
  7.   
  8. str lr, [sp]  
  9. str ip, [sp, #4]  
  10. str fp, [sp, #8]  
  11. sub fp, ip, #4  
  12.     @保存r0到栈中  
  13.     sub sp,sp,#4  
  14.     str r0,[sp]  
  15.     @恢复r0,并对r0地址指向的空间做赋值操作  
  16.     ldr r0,[fp,#-12]  
  17.     mov r1,#0x01e  
  18.     str r1,[r0]  
  19.          @调用printResult打印变量t  
  20.          bl printResult  
  21.     @再次恢复r0,并对r0地址指向的空间做赋值操作  
  22.     ldr r0,[fp,#-12]  
  23.     mov r1,#0x0020  
  24.     str r1,[r0]  
  25. @现场恢复  
  26. ldr lr, [fp, #-8]  
  27. ldr ip, [fp, #-4]  
  28. ldr fp, [fp,#0]  
  29. mov sp, ip  
  30. mov pc , lr  

完成之后就可以编译测试应用了,该应用是一个控制台应用,启动后马上关闭,控制台会输出以下内容:

t is: 10 now
t is: 30 now
t is: 32 now

测试成功后回过头看看代码的细节,理解其中的关键部分才能在以后的现实编程中可以在c代码中灵活调用ARM汇编。

首先看看main.c,首先是有关damonfunction的定义很重要,表明方法damonfunction是一个需要从外部链接进来的方法,该方法有一个参数

  1. extern void damonfunction(int data);  

对应的,在MyASM.S中,就有对damonfunction这个标签的定义:

  1. .globl damonfunction  
  2.   
  3. damonfunction:  

这就意味着在main.c的main函数中通过damonfunction(&t);调用damonfunction时就会调用MyASM.S中从damonfunction这个标签开始的程序。 

  • 1
  • 2
  • 下一页

相关内容