版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C與匯編語(yǔ)言混合編程與匯編語(yǔ)言混合編程 ATPCS介紹介紹 內(nèi)嵌匯編內(nèi)嵌匯編 C和和ARM匯編匯編 程序間相互調(diào)用程序間相互調(diào)用一、一、ATPCS介紹介紹 ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則,目的是為了使單獨(dú)編譯的C語(yǔ)言程序和匯編程序之間能夠相互調(diào)用。這些基本規(guī)則包括子程序調(diào)用過(guò)程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則和參數(shù)的傳遞規(guī)則。 寄存器的使用規(guī)則寄存器的使用規(guī)則 子程序間通過(guò)寄存器R0R3來(lái)傳遞參數(shù),這時(shí),寄存器R0R3可以記作A1A4。 在子程序中,使用寄存器R4R11來(lái)保存局部變量。這時(shí),寄存
2、器 R4R11可以記作V1V8。在Thumb程序中,通常只能使用寄存器R4R7來(lái)保存局部變量 。 寄存器R12用作子程序間的scratch寄存器(用于保存SP,在函數(shù)返回時(shí)使用該寄存器出棧),記作ip。 寄存器R13用作數(shù)據(jù)棧指針,記作sp。 寄存器R14稱為鏈接寄存器,記作lr。 寄存器R15是程序計(jì)數(shù)器,記作pc。 寄存器別名特殊名使用規(guī)則R0a1參數(shù)/結(jié)果scratch寄存器1R1a2 參數(shù)/結(jié)果scratch寄存器2R2a3參數(shù)/結(jié)果scratch寄存器3R3a4參數(shù)/結(jié)果scratch寄存器4R4v1ARM狀態(tài)局部變量寄存器1R5v2ARM狀態(tài)局部變量寄存器2R6v3ARM狀態(tài)局部變
3、量寄存器3R7v4wrARM狀態(tài)局部變量寄存器4Thumb狀態(tài)工作寄存器R8v5ARM狀態(tài)局部變量寄存器5R9v6sbARM狀態(tài)局部變量寄存器6,在支持RWPI的ATPCS中為靜態(tài)基址寄存器R10v7slARM狀態(tài)局部變量寄存器7,在支持?jǐn)?shù)據(jù)棧檢查的ATPCS中為數(shù)據(jù)棧限制指針R11v8fpARM狀態(tài)局部變量寄存器8/幀指針R12ip子程序內(nèi)部調(diào)用的scratch寄存器R13sp數(shù)據(jù)棧指針R14lr連接寄存器R15pc程序計(jì)數(shù)器數(shù)據(jù)棧的使用規(guī)則數(shù)據(jù)棧的使用規(guī)則根據(jù)堆棧指針指向位置的不同 和增長(zhǎng)方向的不同可以分為以下4種數(shù)據(jù)棧 : FD (Full Descending) 滿遞減 ED (Emp
4、ty Descending)空遞減 FA (Full Ascending) 滿遞增 EA (Empty Ascending) 空遞增ATPCS規(guī)定數(shù)據(jù)棧為FD(滿遞減)類型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。 參數(shù)的傳遞規(guī)則參數(shù)的傳遞規(guī)則參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則: 第一個(gè)整數(shù)參數(shù),通過(guò)寄存器R0R3來(lái)傳遞。其他參數(shù)通過(guò)數(shù)據(jù)棧傳遞。 參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則: 當(dāng)參數(shù)不超過(guò)4個(gè)時(shí),可以使用寄存器R0R3來(lái)傳遞參數(shù);當(dāng)參數(shù)超過(guò)4個(gè)時(shí),還可以使用數(shù)據(jù)棧來(lái)傳遞參數(shù) 子程序結(jié)果返回規(guī)則: 結(jié)果為一個(gè)32位的整數(shù)時(shí),可以通過(guò)寄存器R0返回;結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過(guò)寄存器R0和R1返
5、回,依次類推。 二、二、內(nèi)嵌匯編內(nèi)嵌匯編 在C程序中嵌入?yún)R編程序可以實(shí)現(xiàn)一些高級(jí)語(yǔ)言沒有的功能,并可以提高執(zhí)行效率。armcc和armcpp內(nèi)嵌匯編器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。 內(nèi)嵌的匯編指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的變量定義,數(shù)據(jù)交換必須通過(guò)ATPCS進(jìn)行。嵌入式匯編在形式上表現(xiàn)為獨(dú)立定義的函數(shù)體。 內(nèi)嵌匯編指令的語(yǔ)法格式內(nèi)嵌匯編指令的語(yǔ)法格式 _asm(“指令;指令”); ARM C匯編器使用關(guān)鍵字“_asm。如果有多條匯編指令需要嵌入,可以用“”將它們歸為一條語(yǔ)句。如: _asm 指令;指令 指令 需要特別注意的是_as
6、m是兩個(gè)下劃線。 內(nèi)嵌的匯編指令的特點(diǎn)內(nèi)嵌的匯編指令的特點(diǎn) 操作數(shù)可以是寄存器、常量或C表達(dá)式。它們可以是char、short或者int類型,而且是作為無(wú)符號(hào)數(shù)進(jìn)行操作 。內(nèi)嵌的匯編指令中使用物理寄存器有一些限制。常量前的符號(hào)“#”可以省略 只有指令B可以使用C程序中的標(biāo)號(hào),指令BL不能使用C程序中的標(biāo)號(hào)。 不支持匯編語(yǔ)言中用于內(nèi)存分配的偽操作。指令中如果包含常量操作數(shù),該指令可能會(huì)被匯編器展開成幾條指令。 內(nèi)嵌匯編器與內(nèi)嵌匯編器與armasm匯編器的區(qū)別匯編器的區(qū)別 內(nèi)嵌匯編器不支持通過(guò)“”指示符或PC獲取當(dāng)前指令地址; 不支持LDR Rn,= expression偽指令,而使用MOV Rn
7、, expression指令向寄存器賦值; 不支持標(biāo)號(hào)表達(dá)式;不支持ADR和ADRL偽指令; 不支持BX和BLX指令; 不可以向PC賦值; 使用0 x前綴替代“”表示十六進(jìn)制數(shù)。 內(nèi)嵌匯編注意事項(xiàng)內(nèi)嵌匯編注意事項(xiàng) 必須小心使用物理寄存器,如R0R3,LR和PC。 不要使用寄存器尋址變量。 使用內(nèi)嵌匯編時(shí),編譯器自己會(huì)保存和恢復(fù)它可能用到的寄存器,用戶無(wú)須保存和恢復(fù)寄存器。 LDM和STM指令的寄存器列表只允許物理寄存器。 匯編語(yǔ)言用“,”作為操作數(shù)分隔符 三、三、C和和ARM匯編程序間相互調(diào)用匯編程序間相互調(diào)用 在C和ARM匯編程序之間相互調(diào)用必須遵守ATPCS(ARM-Thumb Proce
8、dure Call Standard)規(guī)則。C和匯編之間的相互調(diào)用可以從以下這三方面來(lái)介紹:匯編程序?qū)全局變量的訪問在C語(yǔ)言程序中調(diào)用匯編程序在匯編程序中調(diào)用C語(yǔ)言程序匯編程序訪問全局匯編程序訪問全局C C變量變量 匯編程序可以通過(guò)地址間接訪問在C語(yǔ)言程序中聲明的全局變量。通過(guò)使用IMPORT關(guān)鍵詞引人全局變量,并利用LDR和STR指令根據(jù)全局變量的地址可以訪問它們。對(duì)于不同類型的變量,需要采用不同選項(xiàng)的LDR和STR指令,如下所示: unsigned char LDRB/STRBunsigned short LDRH/STRHunsigned int LDR/STRchar LDRSB/S
9、TRSBshort LDRSH/STRSH AREA globals,CODE,READONLY EXPORT asmsubroutine; IMPORT globvar; asmsubroutine LDR R1,=globvar ;從文字池讀globvar的地 ;址,并將其保存到R1 LDR R0,R1 ;再將其值讀入到寄存器R0中 ADD R0,R0,#2 STR R0,R1 ;修改后再將寄存器R0的值 ;賦予變量globvar MOV PC,LR END在在C語(yǔ)言程序中調(diào)用匯編程序語(yǔ)言程序中調(diào)用匯編程序 為了保證程序調(diào)用時(shí)參數(shù)的正確傳遞,匯編程序的設(shè)計(jì)要遵守ATPCS。在匯編程序中需要
10、使用EXPORT偽操作來(lái)聲明,使得本程序可以被其它程序調(diào)用。同時(shí),在C程序調(diào)用該匯編程序之前需要在C語(yǔ)言程序中使用extern關(guān)鍵詞來(lái)聲明該匯編程序。 C源程序:源程序:# include extern void strcopy(char *d,const char *s) ;用extern聲明一個(gè)函數(shù)為外部函數(shù), ;可以被其他文件中的函數(shù)調(diào)用。int main() const char *srcstr =“First stringsource”;char * dststr =“Second stringdestination”;strcopy(dststr,srcstr);調(diào)用匯編函數(shù)str
11、copy()return(0);匯編源程序:匯編源程序:AREA SCopy,CODE,READONLYEXPORT strcopy ;用EXPORT偽操作聲明該變量可以被其他 ;文件引用,相當(dāng)于聲明了一個(gè)全局變量。 Strcopy ;R0指向目標(biāo)字符串,R1指向源字符串 LDRB R2,R1,#1 ;字節(jié)加載,并更新地址 STRB R2,R0,#1 ;字節(jié)保存,并更新地址 CMP R2,#0 ;檢測(cè)R2是否等于0 BNE strcopy ;若條件不成立則繼續(xù)執(zhí)行 MOV PC,LR ;從子程序返回END在匯編程序中調(diào)用在匯編程序中調(diào)用C語(yǔ)言程序語(yǔ)言程序?yàn)榱吮WC程序調(diào)用時(shí)參數(shù)的正確傳遞,匯編程
12、序的設(shè)計(jì)要遵守ATPCS。在C程序中不需要使用任何關(guān)鍵字來(lái)聲明將被匯編語(yǔ)言調(diào)用的C程序,但是在匯編程序調(diào)用該C程序之前需要在匯編語(yǔ)言程序中使用IMPORT偽操作來(lái)聲明該C程序。在匯編程序中通過(guò)BL指令來(lái)調(diào)用子程序。 C函數(shù)原型:函數(shù)原型:int g(int a,int b,int c,int d,int e)return a+b+c+d+e;/匯編程序調(diào)用C程序g()計(jì)算5個(gè)整數(shù)i, 2*i, 3*i, 4*i, 5*i 的和。 匯編源程序:匯編源程序:EXPORT fAREA f,CODE,READONLYIMPORT g;聲明該變量函數(shù)g( ),i在R0中STR LR,SP,#- 4! ;預(yù)先保存LRADD R
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 16716.5-2024包裝與環(huán)境第5部分:能量回收
- 聲音視頻和信息傳送行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 已殺菌消毒的醫(yī)療器械產(chǎn)品供應(yīng)鏈分析
- 砂輪手工具項(xiàng)目運(yùn)營(yíng)指導(dǎo)方案
- 寄宿處行業(yè)經(jīng)營(yíng)分析報(bào)告
- 地板清潔用脫蠟劑產(chǎn)業(yè)鏈招商引資的調(diào)研報(bào)告
- 建造購(gòu)物中心行業(yè)經(jīng)營(yíng)分析報(bào)告
- 短圍巾項(xiàng)目營(yíng)銷計(jì)劃書
- 移動(dòng)電話用頭戴式耳機(jī)細(xì)分市場(chǎng)深度研究報(bào)告
- 視網(wǎng)膜鏡項(xiàng)目營(yíng)銷計(jì)劃書
- 四年上冊(cè)美術(shù)教案 12《精美的郵票》 人教版
- 2024年共青團(tuán)入團(tuán)積極分子結(jié)業(yè)考試題庫(kù)及答案
- 2024年社區(qū)工作者考試題庫(kù)及答案
- GB/T 15115-2024壓鑄鋁合金
- 2024年度浙江省財(cái)務(wù)開發(fā)限責(zé)任公司社會(huì)招聘公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(kù)(共500題)答案詳解版
- DL-T 892-2021 電站汽輪機(jī)技術(shù)條件
- SMT生產(chǎn)管理流程圖
- (正式版)JBT 14449-2024 起重機(jī)械焊接工藝評(píng)定
- 光的反射和折射相關(guān)flash(直接運(yùn)行版)課件
- 11葡萄溝課件(課件)(31張)語(yǔ)文二年級(jí)上冊(cè)
- 2024年北京市基礎(chǔ)設(shè)施投資有限公司招聘筆試參考題庫(kù)附帶答案詳解
評(píng)論
0/150
提交評(píng)論