国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

arm匯編語言調(diào)用含參數(shù)的C函數(shù)及有關(guān)實例

發(fā)布時間:2016-3-10 09:08    發(fā)布者:designapp
關(guān)鍵詞: arm , C函數(shù)
對于ARM體系來說,不同語言撰寫的函數(shù)之間相互調(diào)用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure CallStandard),ATPCS主要是定義了函數(shù)呼叫時參數(shù)的傳遞規(guī)則以及如何從函數(shù)返回不同于x86的參數(shù)傳遞規(guī)則,ATPCS建議函數(shù)的形參不超過4個,如果形參個數(shù)少于或等于4,則形參由R0,R1,R2,R3四個寄存器進(jìn)行傳遞;若形參個數(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_args
test_asm_args
STR lr, [sp, #-4]!;保存當(dāng)前l(fā)r
ldr r0,=0x10 ;參數(shù) 1
ldr r1,=0x20 ;參數(shù) 2
ldr r2,=0x30 ;參數(shù) 3
ldr r3,=0x40 ;參數(shù) 4
bl test_c_args ;調(diào)用C函數(shù)
LDR pc, [sp], #4 ;將lr裝進(jìn)pc(返回main函數(shù))
END
test_c_args.c
//--------------------------------------------------------------------------------
void test_c_args(int a,int b,int c,int d)
{
printk("test_c_args:\n");
printk("%0x %0x %0x %0x\n",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ù)的傳遞方式就是向R0~R3分別寫入?yún)?shù)值,之后使用bl語句
對test_c_args進(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, READONLY
EXPORT test_asm_args
test_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
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_args_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指向 lr
LDR pc, [sp],#4 ;將lr裝進(jìn)pc(返回main函數(shù))
END
test_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 %0x %0x\n",
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還是通過R0~R3進(jìn)行傳遞,而參數(shù)5~參數(shù)8則是通過把其壓入堆棧的方式進(jìn)行傳遞,不過要注意這四個入棧參數(shù)的入棧順序,是以參數(shù)8->參數(shù)7->參數(shù)6->參數(shù)5的順序入棧的。

直到調(diào)用test_c_args之前,堆棧內(nèi)容如下:

sp->+----------+
|參數(shù)5|
+----------+
|參數(shù)6|
+----------+
|參數(shù)7|
+----------+
|參數(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|
+----------+
|參數(shù)7|
+----------+
|參數(shù)8|
sp->+----------+
| lr |
+----------+
                           
本文地址:http://m.qingdxww.cn/thread-161868-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節(jié)省時間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進(jìn)行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一级毛片q片 | 日韩精品一区在线 | 亚洲第一免费 | 亚洲成人网页 | 操操干| 五月天中文字幕 | 曰曰操| 日韩伦理片免费在线观看 | 国产午夜亚洲精品 | 精品资源在线 | 亚洲女人国产香蕉久久精品 | 一二三四免费高清视频社区 | 国产白嫩美女在线观看 | 欧美一级做一级爱a做片性 欧美一级做一a做片性视频 | 亚洲天堂男人天堂 | 欧美裸阴 | 成人网在线看 | 午夜香蕉成视频人网站高清版 | 韩国福利影视一区二区三区 | 亚洲尹人香蕉网在线视颅 | 日本久久久久中文字幕 | 日本中文字幕一区二区有码在线 | 99这里有精品 | 国产毛片一区二区 | 天美麻豆国产传媒免费视频 | 肉视频在线观看 | 综合色在线 | 黄视频网站大全 | 果冻天美a∨传媒 | 成人在线色视频 | 日本黄色免费在线视频 | 99re7在线精品免费视频 | 麻豆md传媒新剧国产在线 | 成人午夜性影院视频 | 欧美成人性生活 | 国产四虎免费精品视频 | 黄色的网站免费 | 日本欧美黄色 | 插吧网| 亚洲国产婷婷香蕉久久久久久 | 欧区一欧区二欧区三免费 |