ARM在匯編代碼中調(diào)用C函數(shù)_第1頁
ARM在匯編代碼中調(diào)用C函數(shù)_第2頁
ARM在匯編代碼中調(diào)用C函數(shù)_第3頁
ARM在匯編代碼中調(diào)用C函數(shù)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、ARM在匯編代碼中調(diào)用C函數(shù)對 于ARM體系來說,不同語言撰寫的函數(shù)之間相互調(diào)用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定義了函數(shù)呼叫時參數(shù)的傳遞規(guī)則以及如何從函數(shù)返回,關(guān)于ATPCS的詳細(xì)內(nèi)容可以查看ADS1.2 Online Books Developer Guide的2.1節(jié)。這篇文檔要講的是匯編代碼中對C函數(shù)調(diào)用時如何進(jìn)行參數(shù)的傳遞以及如何從C函數(shù)正確返回不同于x86的參數(shù)傳遞規(guī)則,ATPCS建議函數(shù)的形參不超過4個,如果形參個數(shù)少于或等于4,則形參由R0,R1,R2,R3四個寄存器進(jìn)行傳遞;若形

2、參個數(shù)大于4,大于4的部分必須通過堆棧進(jìn)行傳遞。我們先討論一下形參個數(shù)為4的情況.實例1:test_asm_args.asm/-        IMPORT test_c_args ;聲明test_c_args函數(shù)        AREA TEST_ASM, CODE, READONLY        EXPORT test_asm_argstest_asm_args      STR lr, sp, #-4! ;保存當(dāng)前l(fā)r  

3、60;     ldr r0,=0x10      ;參數(shù) 1        ldr r1,=0x20        ;參數(shù) 2        ldr r2,=0x30        ;參數(shù) 3        ldr r3,=0x40      ;參數(shù) 4        bl t

4、est_c_args      ;調(diào)用C函數(shù)        LDR pc, sp, #4  ;將lr裝進(jìn)pc(返回main函數(shù))         ENDtest_c_args.c/-void test_c_args(int a,int b,int c,int d)        printk("test_c_args:n");        printk("%0x %

5、0x %0x %0xn",a,b,c,d);main.c/-int main()    test_asm_args();    for(;);程序從main函數(shù)開始執(zhí)行,main調(diào)用了test_asm_args,test_asm_args調(diào)用了test_c_args,最后從test_asm_args返回main.代 碼分別使用了匯編和C定義了兩個函數(shù),test_asm_args 和 test_c_args,test_asm_args調(diào)用了test_c_args,其參數(shù)的傳遞方式就是向R0R3分別寫入?yún)?shù)值,之后使用bl語句 對test_c_ar

6、gs進(jìn)行調(diào)用。其中值得注意的地方是用紅色標(biāo)記的語句,test_asm_args在調(diào)用test_c_args之前必須把當(dāng)前的 lr入棧,調(diào)用完test_c_args之后再把剛才保存在棧中的lr寫回pc,這樣才能返回到main函數(shù)中。如果test_c_args的參數(shù)是8個呢?這種情況test_asm_args應(yīng)該怎樣傳遞參數(shù)呢?實例2:test_asm_args.asm/-        IMPORT test_c_args ;聲明test_c_args函數(shù)        AREA TEST_ASM, CODE, RE

7、ADONLY        EXPORT test_asm_argstest_asm_args      STR lr, sp, #-4! ;保存當(dāng)前l(fā)r      ldr r0,=0x1 ;參數(shù) 1      ldr r1,=0x2 ;參數(shù) 2      ldr r2,=0x3 ;參數(shù) 3      ldr r3,=0x4 ;參數(shù) 4      ldr r4,=0x8

8、0;     str r4,sp,#-4! ;參數(shù) 8 入棧      ldr r4,=0x7      str r4,sp,#-4! ;參數(shù) 7 入棧      ldr r4,=0x6      str r4,sp,#-4! ;參數(shù) 6 入棧      ldr r4,=0x5      str r4,sp,#-4! ;參數(shù) 5 入棧      bl test_c_a

9、rgs_lots      ADD sp, sp, #4    ;清除棧中參數(shù) 5,本語句執(zhí)行完后sp指向 參數(shù)6       ADD sp, sp, #4    ;清除棧中參數(shù) 6,本語句執(zhí)行完后sp指向 參數(shù)7      ADD sp, sp, #4    ;清除棧中參數(shù) 7,本語句執(zhí)行完后sp指向 參數(shù)8      ADD sp, sp, #4    ;清除棧中參數(shù) 8,本語句執(zhí)行完后sp指

10、向 lr      LDR pc, sp,#4    ;將lr裝進(jìn)pc(返回main函數(shù))         ENDtest_c_args.c/-void test_c_args(int a,int b,int c,int d,int e,int f,int g,int h)      printk("test_c_args_lots:n");      printk("%0x %0x %0x %0x %0x %0x

11、%0x %0xn",              a,b,c,d,e,f,g,h);main.c/-int main()    test_asm_args();    for(;);這部分的代碼和實例1的代碼大部分是相同的,不同的地方是test_c_args的參數(shù)個數(shù)和test_asm_args的參數(shù)傳遞方式。在test_asm_args中,參數(shù)1參數(shù)4還是通過R0R3進(jìn)行傳遞,而參數(shù)5參數(shù)8則是通過把其壓入堆棧的方式進(jìn)行傳遞,不過要注意這四個入棧參數(shù)的入棧順序,是以參數(shù)8-&

12、gt;參數(shù)7->參數(shù)6->參數(shù)5的順序入棧的。直到調(diào)用test_c_args之前,堆棧內(nèi)容如下:sp->+-+        |  參數(shù)5  |      +-+        |  參數(shù)6  |      +-+        |  參數(shù)7  |      +-+      &#

13、160; |  參數(shù)8  |      +-+        |    lr      |      +-+test_c_args執(zhí)行返回后,則設(shè)置sp,對之前入棧的參數(shù)進(jìn)行清除,最后將lr裝入pc返回main函數(shù),在執(zhí)行 LDR pc, sp,#4 指令之前堆棧內(nèi)容如下:      +-+        |  參數(shù)5  |      +-+        |  參數(shù)6  |      +-+  &#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論