歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

在BlackBerry PlayBook NDK 開發中嵌入ARM匯編語句

在BlackBerry PlayBook NDK開發中使用的是c和c++,都是編譯後執行。在特殊情況下如果有需要使用匯編的話,也可以在使用c或者是c++的過程中嵌入匯編語句。

因為PlayBook使用的是ARM的CPU所以使用的匯編也就是ARM的匯編了。

之前在學習BeagleBoard上的QNX編程時也做過類似的實驗,在c程序中嵌入使用ARM匯編語句。總結出來的結果是將ARM匯編獨立到一個.S文件中會比較方便,更多的細節請參考。(http://www.linuxidc.com/Linux/2011-09/43471.htm 與http://www.linuxidc.com/Linux/2011-09/43472.htm)

為了測試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這個標簽開始的程序。 

Copyright © Linux教程網 All Rights Reserved