版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、3.4 ATPCS介紹1n完全使用匯編語言來編寫程序會非常的繁瑣,因此通常情況下,只是使用匯編程序來完成少量必須由匯編程序才能完成的工作,而其它工作則由C語言程序來完成。這樣一來,我們實際上就是在進(jìn)行匯編和C的混合編程,甚至同一個程序的匯編源文件和C源文件是由不同的程序員編寫的。在這種情況下,要想使不同程序員編寫的匯編代碼和C代碼能耦合的很好,則必須有一個雙方都必須遵守的規(guī)則,這就是ATPCS規(guī)則。n為了使單獨(dú)編譯的C語言程序和匯編程序之間能夠相互調(diào)用,必須為子程序間的調(diào)用規(guī)定一定的規(guī)則。ATPCS就是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則。什么是什么是ATPCS規(guī)則規(guī)則231 AT
2、PCS概述nATPCS規(guī)定了一些子程序間調(diào)用的基本規(guī)則。這些基本規(guī)則包括子程序調(diào)用過程中寄存器、數(shù)據(jù)棧的使用規(guī)則以及參數(shù)的傳遞規(guī)則。 n這些特定的調(diào)用規(guī)則包括:q支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS。q支持只讀段位置無關(guān)位置無關(guān)(ROPI)的ATPCS。q支持可讀寫段位置無關(guān)(RWPI)的ATPCS。q支持ARM程序和Thumb程序混合使用的ATPCS。q處理浮點(diǎn)運(yùn)算的ATPCS。41.1 ATPCS概述n使用ADS的C語言編譯器編譯的C語言子程序滿足用戶指定的ATPCS類型。n對于匯編語言程序來說,完全要依賴用戶來保證各子程序滿足選定的ATPCS類型。具體來說,匯編語言子程序必須滿足下面3個條件:
3、q在子程序編寫時必須遵守相應(yīng)的ATPCS規(guī)則。q數(shù)據(jù)棧的使用要遵守相應(yīng)的ATPCS規(guī)則。q在匯編編譯器中使用apcs選項。51.2 基本ATPCSn基本ATPCS規(guī)定了在子程序調(diào)用時的一些基本規(guī)則,包括下面3方面的內(nèi)容:q各寄存器的使用規(guī)則及其相應(yīng)的名稱。q數(shù)據(jù)棧的使用規(guī)則。q參數(shù)傳遞的規(guī)則。61.2.1 寄存器的使用規(guī)則n寄存器的使用必須滿足下面的規(guī)則。q子程序間通過寄存器R0R3來傳遞參數(shù)傳遞參數(shù)。 q在子程序中,使用寄存器R4R11來保存局部變量保存局部變量。 q寄存器R12用作子程序調(diào)用中臨時寄存器,記作ip。在子程序之間的連接代碼段中常常有這種使用規(guī)則。q寄存器R13用作數(shù)據(jù)棧指針,
4、記作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在進(jìn)入子程序時的值和退出子程序時的值必須相等。q寄存器R14稱為鏈接寄存器,記作lr。 q寄存器R15是程序計數(shù)器,記作pc。它不能用作其他用途。71.2.2 數(shù)據(jù)棧使用規(guī)則n棧指針通常可以指向不同的位置。當(dāng)棧指針指向棧頂元素(即最后一個入棧的數(shù)據(jù)元素)時,稱為FULL棧;當(dāng)棧指針指向與棧頂元素(即最后一個入棧的數(shù)據(jù)元素)相鄰的一個可用數(shù)據(jù)單元時,稱為EMPTY棧。n綜合這兩種特點(diǎn)可以有以下4種數(shù)據(jù)棧。qFD Full DescendingqED Empty DescendingqFA Full AscendingqEA Empty
5、Ascending81.2.2 數(shù)據(jù)棧使用規(guī)則n下面是一個數(shù)據(jù)棧的示例(如圖6.1所示)及其相關(guān)的名詞。 ?;刂?棧指針 棧的上限地址 已使用的 棧空間 未使用的 ??臻g 棧中數(shù)據(jù) 91.2.2 數(shù)據(jù)棧使用規(guī)則q數(shù)據(jù)棧棧指針(stack pointer) 是指最后一個寫入棧的數(shù)據(jù)的內(nèi)存地址。q數(shù)據(jù)棧的基地址(stack base) 指數(shù)據(jù)棧的最高地址。由于ATPCS中數(shù)據(jù)棧是FD類型的,實際上數(shù)據(jù)棧中最早入棧的數(shù)據(jù)占據(jù)的內(nèi)存單元是基地址的下一個內(nèi)存單元。q數(shù)據(jù)棧界限(stack limit) 是指數(shù)據(jù)棧中可以使用的最低的內(nèi)存單元的地址。101.2.2 數(shù)據(jù)棧使用規(guī)則(續(xù))q已占用的數(shù)據(jù)棧(u
6、sed stack) 是指數(shù)據(jù)棧的基地址和數(shù)據(jù)棧棧指針之間的區(qū)域。其中包括數(shù)據(jù)棧棧指針對應(yīng)的內(nèi)存單元,但不包括數(shù)據(jù)棧的基地址對應(yīng)的內(nèi)存單元。q未占用的數(shù)據(jù)棧(unused stack) 是指數(shù)據(jù)棧棧指針和數(shù)據(jù)棧界限之間的區(qū)域。其中包括數(shù)據(jù)棧界限對應(yīng)的內(nèi)存單元,但不包括數(shù)據(jù)棧棧指針對應(yīng)的內(nèi)存單元。q數(shù)據(jù)棧中的數(shù)據(jù)幀數(shù)據(jù)幀(stack frames) 是指在數(shù)據(jù)棧中,為子程序分配的用來保存寄存器和局部變量的區(qū)域。1.2.3 參數(shù)傳遞規(guī)則n根據(jù)參數(shù)個數(shù)是否固定,可以將子程序分為參數(shù)個數(shù)固定的子程序和參數(shù)個數(shù)可變化的子程序。n這兩種子程序的參數(shù)傳遞規(guī)則是不一樣的。參數(shù)個數(shù)可變子程序參數(shù)傳遞規(guī)則 n對于
7、參數(shù)個數(shù)可變的子程序,當(dāng)參數(shù)個數(shù)不超過4個時,可以使用寄存器R0R3來傳遞參數(shù);當(dāng)參數(shù)超過4個時,還可以使用堆棧來傳遞參數(shù)。n在傳遞參數(shù)時,將所有參數(shù)看作是存放在連續(xù)的內(nèi)存字單元的字?jǐn)?shù)據(jù)。然后,依次將各字?jǐn)?shù)據(jù)傳遞到寄存器R0,R1,R2和R3中。如果參數(shù)多于如果參數(shù)多于4個,則將剩余的字?jǐn)?shù)據(jù)傳遞到堆棧中。個,則將剩余的字?jǐn)?shù)據(jù)傳遞到堆棧中。入棧的順序與參數(shù)傳遞順序相反,即最后一個字?jǐn)?shù)據(jù)先入棧。參數(shù)個數(shù)固定子程序參數(shù)傳遞規(guī)則n如果系統(tǒng)不包含浮點(diǎn)運(yùn)算的硬件部件,浮點(diǎn)參數(shù)會通過相應(yīng)的規(guī)則轉(zhuǎn)換成整數(shù)參數(shù)(若沒有浮點(diǎn)參數(shù),此步省略),然后依次將各字?jǐn)?shù)據(jù)傳送到寄存器R0R3中。如果參數(shù)多于4個,將剩余的字?jǐn)?shù)
8、據(jù)傳送堆棧中,入棧的順序與參數(shù)順序相反,即最后一個字?jǐn)?shù)據(jù)先入棧。在參數(shù)傳遞時,將所有參數(shù)看作是存放在連續(xù)的內(nèi)存字單元的字?jǐn)?shù)據(jù)。子程序結(jié)果返回規(guī)則n子程序中結(jié)果返回的規(guī)則如下:q結(jié)果為一個32位整數(shù)時,可以通過寄存器R0返回;q結(jié)果為一個64位整數(shù)時,可以通過寄存器R0和R1返回;q結(jié)果為一個浮點(diǎn)數(shù)時,可以通過浮點(diǎn)運(yùn)算部件的寄存器f0、d0或s0來返回;q結(jié)果為復(fù)合型浮點(diǎn)數(shù)(如復(fù)數(shù))時,可以通過寄存器f0fn或d0dn來返回;q對于位數(shù)更多的結(jié)果,需要通過內(nèi)存來傳遞。 調(diào)用ARM匯編語言子程序n在ARM匯編語言中,子程序調(diào)用是通過BL指令完成的BL指令的語法格式如下:qBL subnameq其中
9、,subname是調(diào)用的子程序的名稱。nBL指令完成兩個操作:將子程序的返回地址放在LR寄存器中,同時將PC寄存器值設(shè)置成目標(biāo)子程序的第一條指令地址。n在子程序返回時可以通過將LR寄存器的值傳送到PC寄存器中來實現(xiàn)。n子程序調(diào)用時通常使用寄存器R0R3來傳遞參數(shù)和返回結(jié)果。調(diào)用匯編子程序舉例n子程序DOADD完成加法運(yùn)算,操作數(shù)放在R0和R1寄存器中,結(jié)果放在R0中。AREA EXAMPLE2, CODE, READONLYENTRYstartMOV r0, #10 ;R0設(shè)置輸入?yún)?shù)MOV r1, #3 ;R1設(shè)置輸入?yún)?shù)BLdoadd;調(diào)用子程序doadd.doaddADD r0, r0,
10、 r1 ;子程序?qū)嶓wMOVpc,lr ;從子程序中返回ENDint func1(int a, int b, int c, int d) return a+b+c+d;int caller1(void) return func1(1,2,3,4); func1 0 x000000 : ADD r0,r0,r1 0 x000004 : ADD r0,r0,r2 0 x000008 : ADD r0,r0,r3 0 x00000c : MOV pc,lr caller1 0 x000014 : MOV r3,#4 0 x000018 : MOV r2,#3 0 x00001c : MOV r1,#2
11、 0 x000020 : MOV r0,#1 0 x000024 : BL func1參數(shù)傳遞舉例參數(shù)傳遞舉例 (4 parameters)181.3 幾種特定的ATPCSn幾種特定的ATPCS是在遵守基本的ATPCS同時,增加一些規(guī)則以支持一些特定的功能:q支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS。q支持只讀段位置無關(guān)(ROPI)的ATPCS。q支持可讀寫段位置無關(guān)(RWPI)的ATPCS。q支持ARM程序和Thumb程序混合使用的ATPCS。q處理浮點(diǎn)運(yùn)算的ATPCS。191.3.1 支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS1. 支持?jǐn)?shù)據(jù)棧限制檢查的ATPCSn基本原理q在進(jìn)行數(shù)據(jù)棧的檢查時,使用寄存器r10
12、作為數(shù)據(jù)棧限制指針,這是寄存器r10記作sl,用戶在程序中不能控制該寄存器。2. 編寫遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS的匯編語言程序q對于C/C+,在編譯時指定選項/swst,生產(chǎn)的目標(biāo)代碼將遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS。q對于匯編程序,用戶在編寫程序時必須滿足支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS所要求的規(guī)則,然后在匯編時指定選項/swst。201.3.2 支持只讀段位置無關(guān)(ROPI)的ATPCS1. 支持只讀段(代碼或數(shù)據(jù))位置無關(guān)(ROPI)的ATPCS的應(yīng)用場合q程序在運(yùn)行期間動態(tài)加載到內(nèi)存中;q在不同的場合,與不同的程序組合后加載到內(nèi)存中;q在運(yùn)行期間映射到不同的地址;2. 遵守支
13、持只讀段位置無關(guān)(ROPI)的ATPCS的程序設(shè)計(ADR/ADRL偽指令)q引用同一個ROPI段中的符號時必須是基于pc的;qROPI段對其它段的引用必須是絕對地址,或基于sb的可寫數(shù)據(jù);211.3.3 支持可讀寫段位置無關(guān)(RWPI)的ATPCSn如果一個程序中所有的可讀寫段都是位置無關(guān),則稱該程序遵守支持可讀寫段位置無關(guān)(RWPI)的ATPCS。使用支持可讀寫段位置無關(guān)(RWPI)的ATPCS可以避免必須將程序存放到特定的位置。這時寄存器R9通常用作靜態(tài)基址寄存器,記作sb??芍厝氲淖映绦蚩梢栽趦?nèi)存中同時有多個實例,各個實例擁有獨(dú)立的可讀寫段。在生成一個新的實例時,sb指向該實例的可讀寫
14、段。RWPI段中的符號的計算方法為:連接器首先計算出該符號相對于RWPI段中某一特定位置的偏移量,通常該特定位置選為RWPI段的第一個字節(jié)出;在程序運(yùn)行時,將該偏移量加到sb上即可生成該符號的地址。221.3.4 支持ARM程序和Thumb程序混合使用的ATPCSn在編譯或者匯編時,使用/interwork告訴編譯器(或匯編器)生成的目標(biāo)代碼遵守支持ARM程序和Thumb程序混合使用的ATPCS。它用在以下場合:q程序中存在ARM程序調(diào)用Thumb程序的情況。q程序中存在Thumb程序調(diào)用ARM程序的情況。q需要連接器來進(jìn)行ARM狀態(tài)和Thumb狀態(tài)切換的情況。n在下述情況下,使用選項/nointerwork。q程序中不包含Thumb程序。q用戶自己進(jìn)行ARM狀態(tài)和Thumb狀態(tài)切換。q其中,選項/nointerwork是默認(rèn)的選項。231.3.5 處理浮點(diǎn)運(yùn)算的ATPCSnATPCS支持VFP體系和FPA體系兩種不同的浮點(diǎn)硬件體系和指令集。兩種體系對應(yīng)的代碼不兼容n相應(yīng)地,ADS的編譯器和匯編器有下面6種與浮點(diǎn)數(shù)相關(guān)的選項:qfpu VFPqfpu FPAqfpu softVFPqfpu softVFP+VFPqfpu softFPAqfpu none241.3.5 處理浮點(diǎn)運(yùn)算的ATPCSn當(dāng)系統(tǒng)中包含有
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年市中心區(qū)域照明系統(tǒng)節(jié)能優(yōu)化合同4篇
- 2025年度促銷員團(tuán)隊建設(shè)與協(xié)作合同4篇
- 2025年度金融理財產(chǎn)品銷售合同欺詐賠償及風(fēng)險防范4篇
- 二零二五版借貸房屋買賣合同糾紛調(diào)解協(xié)議4篇
- 二零二五年度大連商品交易所鐵礦石期貨合約交易信息保密協(xié)議4篇
- 二零二五年度打架糾紛私了和解合同范本4篇
- 2025年度大型水利工程合同擔(dān)保協(xié)議4篇
- 2025年度倉儲物流車位使用權(quán)轉(zhuǎn)讓合同樣本3篇
- 二零二五年度煤炭行業(yè)安全生產(chǎn)責(zé)任合同模板4篇
- 二零二五版餐飲企業(yè)財務(wù)外包合作協(xié)議3篇
- 《向心力》參考課件4
- 2024至2030年中國膨潤土行業(yè)投資戰(zhàn)略分析及發(fā)展前景研究報告
- 【地理】地圖的選擇和應(yīng)用(分層練) 2024-2025學(xué)年七年級地理上冊同步備課系列(人教版)
- 2024年深圳中考數(shù)學(xué)真題及答案
- 土方轉(zhuǎn)運(yùn)合同協(xié)議書
- Module 3 Unit 1 Point to the door(教學(xué)設(shè)計)-2024-2025學(xué)年外研版(三起)英語三年級上冊
- 智能交通信號燈安裝合同樣本
- 安全生產(chǎn)法律法規(guī)清單(2024年5月版)
- 江蘇省連云港市2023-2024學(xué)年八年級下學(xué)期期末道德與法治試卷(含答案解析)
- 2024年大學(xué)試題(宗教學(xué))-佛教文化筆試考試歷年高頻考點(diǎn)試題摘選含答案
- JBT 14588-2023 激光加工鏡頭 (正式版)
評論
0/150
提交評論