歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 在BlackBerry PlayBook NDK 開發中嵌入ARM匯編語句

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

日期:2017/3/1 10:27:26   编辑:Linux編程
在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. extern void damonfunction(int data);
  4. long t;
  5. void printResult(){
  6. printf ("t is: %d now \n",t);
  7. }
  8. int main(int argc, char *argv[]) {
  9. t=10;
  10. printResult();
  11. damonfunction(&t);
  12. printResult();
  13. return EXIT_SUCCESS;
  14. }

然後在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. str lr, [sp]
  8. str ip, [sp, #4]
  9. str fp, [sp, #8]
  10. sub fp, ip, #4
  11. @保存r0到棧中
  12. sub sp,sp,#4
  13. str r0,[sp]
  14. @恢復r0,並對r0地址指向的空間做賦值操作
  15. ldr r0,[fp,#-12]
  16. mov r1,#0x01e
  17. str r1,[r0]
  18. @調用printResult打印變量t
  19. bl printResult
  20. @再次恢復r0,並對r0地址指向的空間做賦值操作
  21. ldr r0,[fp,#-12]
  22. mov r1,#0x0020
  23. str r1,[r0]
  24. @現場恢復
  25. ldr lr, [fp, #-8]
  26. ldr ip, [fp, #-4]
  27. ldr fp, [fp,#0]
  28. mov sp, ip
  29. 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. damonfunction:

這就意味著在main.c的main函數中通過damonfunction(&t);調用damonfunction時就會調用MyASM.S中從damonfunction這個標簽開始的程序。

Copyright © Linux教程網 All Rights Reserved