



下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一年級上冊數(shù)學(xué)教案-3.2 還剩下多少-北師大版
- 二年級下冊數(shù)學(xué)教案-4.3 認(rèn)識平形四邊形 |西師大版
- (高清版)DB45∕T 502-2022 柑桔木虱綠色防治技術(shù)規(guī)程
- 統(tǒng)編版語文一年級下冊第一單元2姓氏歌 公開課一等獎創(chuàng)新教學(xué)設(shè)計(表格式)
- 2025年湖南工業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫一套
- 2025年廣東省汕頭市單招職業(yè)傾向性測試題庫新版
- 2025年度單位與職工解除勞動合同及社會保險關(guān)系處理合同
- 2025年度婚內(nèi)債務(wù)解決與婚姻財產(chǎn)分配協(xié)議
- 2025年度房產(chǎn)抵押小微企業(yè)貸款合同模板
- 2025年度兒童房安全木門定制合同
- 溫濕度對果蔬儲存的影響
- 海運客服專員崗位職責(zé)
- 電是怎么產(chǎn)生的
- 新概念英語第一冊課文完整版
- 急救藥品搶救藥品培訓(xùn)
- 人教鄂教版三年級下冊科學(xué)全冊教案
- 如何做好一名優(yōu)秀的項目經(jīng)理
- (完整word版)中考定語從句精講+練習(xí)答案
- 醫(yī)師簽名(簽章)留樣備案表
- 0~6歲兒童眼保健和視力檢查標(biāo)準(zhǔn)技術(shù)操作
- 卷內(nèi)目錄填寫式樣
評論
0/150
提交評論