女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

ATPCS基本規(guī)則

安芯教育科技 ? 來源:極術社區(qū) ? 作者:Nuoeriris ? 2022-05-27 10:12 ? 次閱讀

為了使單獨編譯的C語言程序和匯編程序之間能夠相互調(diào)用,必須為子程序之間的調(diào)用規(guī)定一定的規(guī)則,ATPCS就是ARM程序和THUMB程序中子程序調(diào)用的基本規(guī)則。

1. ATPCS


ATPCS即ARM Thumb Procedure Call Standard(ARM-Thumb過程調(diào)用標準)的簡稱,ATPCS規(guī)定了一些調(diào)用和被調(diào)用程序之間調(diào)用的基本規(guī)則,這些基本規(guī)則包括子程序調(diào)用過程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則、參數(shù)的傳遞規(guī)則。為適應一些特定的需要,對這些基本的調(diào)用規(guī)則進行一些修改得到幾種不同的子程序調(diào)用規(guī)則,這些特定的調(diào)用規(guī)則包括:

  • 支持數(shù)據(jù)棧限制檢查的ATPCS

  • 支持只讀段位置無關的ATPCS

  • 支持可讀寫段位置無關的ATPCS

  • 支持ARM程序和THUMB程序混合使用的ATPCS

有調(diào)用關系的所有子程序必須遵守同一種ATPCS,編譯器或者匯編器在ELF格式的目標文件中設置相應的屬性,標識用戶選定的ATPCS類型。對應不同類型的ATPCS規(guī)則,有相應的C語言庫,連接器根據(jù)用戶指定的ATPCS類型連接相應的C語言庫。使用ADS的C語言編譯器編譯的C語言子程序滿足用戶指定的ATPCS類型。而對于匯編語言程序來說,完全要依賴用戶來保證各子程序滿足選定的ATPCS類型。具體來說,匯編語言子程序必須滿足下面三個條件:在子程序編寫時必須遵守相應的ATPCS規(guī)則;數(shù)據(jù)棧的使用要遵守ATPCS規(guī)則;在匯編編譯器中使用“--apcs”選項,使用“--apcs”選項并不影響代碼的產(chǎn)生,編譯器只是在各段中放置相應的屬性,標識用戶選定的屬性。

2. ATPCS基本規(guī)則


基本ATPCS規(guī)定了在子程序調(diào)用時的一些基本規(guī)則,包括以下四個方面的內(nèi)容:
  • 寄存器的使用規(guī)則及其相應的名字

  • 數(shù)據(jù)棧的使用規(guī)則

  • 參數(shù)傳遞的規(guī)則

  • 函數(shù)結果返回的規(guī)則

相對于其他類型的TPCS,滿足基本ATPCS的程序的執(zhí)行速度更快,所占用的內(nèi)存更少。但是它不能提供以下的支持:ARM程序和THUMB程序相互調(diào)用;數(shù)據(jù)以及代碼的位置無關的支持;子程序的可重入性;數(shù)據(jù)棧檢查的支持。而派生的其他幾種特定的ATPCS就是在基本ATPCS的基礎上再添加其他的規(guī)則而形成的 ,其目的就是提供上述的功能。
2.1 寄存器的使用規(guī)則
16f6f982-dd5a-11ec-ba43-dac502259ad0.png ?前四個寄存器R0~R3用于將參數(shù)值傳遞到例程中并將結果值傳遞出例程,并在例程中保存中間值(但通常僅在子例程調(diào)用之間),子程序通過寄存器R0~R3來傳遞參數(shù),這時寄存器可以記作:A1~A4,被調(diào)用的子程序在返回前無需恢復寄存器R0~R3的內(nèi)容。在子程序中,使用R4~R11來保存局部變量,這時寄存器R4~R11可以記作:V1~V8 。如果在子程序中使用到V1~V8的某些寄存器,子程序進入時必須保存這些寄存器的值,在返回前必須恢復這些寄存器的值,對于子程序中沒有用到的寄存器則不必執(zhí)行這些操作。在THUMB程序中,通常只能使用寄存器R4~R7來保存局部變量。寄存器R12用作子程序間暫存寄存器,記作IP;在子程序的連接代碼段中經(jīng)常會有這種使用規(guī)則。寄存器R13用作數(shù)據(jù)棧指針,記做SP,在子程序中寄存器R13不能用做其他用途。寄存器SP在進入子程序時的值和退出子程序時的值必須相等。寄存器R14用作連接寄存器,記作LR;它用于保存子程序的返回地址,如果在子程序中保存了返回地址,則R14可用作其它的用途。寄存器R15是程序計數(shù)器,記作PC;它不能用作其它用途。ATPCS中的各寄存器在ARM編譯器和匯編器中都是預定義的。
2.2 數(shù)據(jù)棧的使用規(guī)則
棧指針通??梢灾赶虿煌奈恢?,當棧指針指向棧頂元素(即最后一個入棧的數(shù)據(jù)元素)時,稱為Full棧。當棧指針指向與棧頂元素相鄰的一個元素時,稱為Empty棧。數(shù)據(jù)棧的增長方向也可以不同,當數(shù)據(jù)棧向內(nèi)存減小的地址方向增長時,稱為Descending棧。當數(shù)據(jù)棧向著內(nèi)存地址增加的方向增長時,稱為Ascending棧。綜合這兩種特點可以由以下4種數(shù)據(jù)棧:

	FD(FULL Descending):遞增滿棧 ED(Empty Descending):遞增空棧 FA(FULL Ascending):遞減滿棧 EA(Empty Ascending):遞減空棧 ATPCS規(guī)定數(shù)據(jù)棧為FD類型,并對數(shù)據(jù)棧的操作是8字節(jié)對齊的,下面是一個數(shù)據(jù)棧的示例及相關的名詞:
  1. 數(shù)據(jù)棧棧指針,stack pointer指向最后一個寫入棧的數(shù)據(jù)的內(nèi)存地址。

  2. 數(shù)據(jù)棧的基地址,stack base是指數(shù)據(jù)棧的最高地址。由于ATPCS中的數(shù)據(jù)棧是FD類型的,實際上數(shù)據(jù)棧中最早入棧數(shù)據(jù)占據(jù)的內(nèi)存單元是基地址的下一個內(nèi)存單元。

  3. 數(shù)據(jù)棧界限,stack limit是指數(shù)據(jù)棧中可以使用的最低的內(nèi)存單元地址。

  4. 已占用的數(shù)據(jù)棧,used stack是指數(shù)據(jù)棧的基地址和數(shù)據(jù)棧棧指針之間的區(qū)域,其中包括數(shù)據(jù)棧棧指針對應的內(nèi)存單元。

  5. 數(shù)據(jù)棧中的數(shù)據(jù)幀(stack frames) 是指在數(shù)據(jù)棧中,為子程序分配的用來保存寄存器和局部變量的區(qū)域。

VAL(SP) <= stack base, VAL(SP) >= VAL(SL) >= stack limit + 256, VAL(LR) = return address

異常中斷的處理程序可以使用被中斷程序的數(shù)據(jù)棧,這時用戶要保證中斷的程序數(shù)據(jù)棧足夠大。使用ADS編譯器產(chǎn)生的目標代碼中包含了DRFAT2格式的數(shù)據(jù)幀。在調(diào)試過程中,調(diào)試器可以使用這些數(shù)據(jù)幀來查看數(shù)據(jù)棧中的相關信息。而對于匯編語言來說,用戶必須使用FRAME偽操作來描述數(shù)據(jù)棧中的數(shù)據(jù)幀。ARM匯編器根據(jù)這些偽操作在目標文件中產(chǎn)生相應的DRFAT2格式的數(shù)據(jù)幀。在ARMv5TE中,批量傳送指令LDRD/STRD要求數(shù)據(jù)棧是8字節(jié)對齊的,以提高數(shù)據(jù)的傳送速度。用ADS編譯器產(chǎn)生的目標文件中,外部接口的數(shù)據(jù)棧都是8字節(jié)對齊的,并且編譯器將告訴連接器:本目標文件中的數(shù)據(jù)棧是8字節(jié)對齊的。而對于匯編程序來說,如果目標文件中包含了外部調(diào)用,則必須滿足以下條件:外部接口的數(shù)據(jù)棧一定是8位對齊的,也就是要保證在進入該匯編代碼后,直到該匯編程序調(diào)用外部代碼之間,數(shù)據(jù)棧的棧指針變化為偶數(shù)個字;在匯編程序中使用PRESERVE8偽操作告訴連接器,本匯編程序是8字節(jié)對齊的。17248938-dd5a-11ec-ba43-dac502259ad0.png
2.3 參數(shù)的傳遞規(guī)則
根據(jù)參數(shù)個數(shù)是否固定,可以將子程序分為參數(shù)個數(shù)固定的子程序和參數(shù)個數(shù)可變的子程序。這兩種子程序的參數(shù)傳遞規(guī)則是不同的。參數(shù)個數(shù)可變的子程序參數(shù)傳遞規(guī)則,對于參數(shù)個數(shù)可變的子程序,當參數(shù)不超過4個時,可以使用寄存器R0~R3來進行參數(shù)傳遞,當參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù)。在參數(shù)傳遞時,將所有參數(shù)看做是存放在連續(xù)的內(nèi)存單元中的字數(shù)據(jù)。然后,依次將各名字數(shù)據(jù)傳送到寄存器R0,R1,R2,R3;如果參數(shù)多于4個,將剩余的字數(shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個字數(shù)據(jù)先入棧。按照上面的規(guī)則,一個浮點數(shù)參數(shù)可以通過寄存器傳遞,也可以通過數(shù)據(jù)棧傳遞,也可能一半通過寄存器傳遞,另一半通過數(shù)據(jù)棧傳遞。參數(shù)個數(shù)固定的子程序參數(shù)傳遞規(guī)則,對于參數(shù)個數(shù)固定的子程序,參數(shù)傳遞與參數(shù)個數(shù)可變的子程序參數(shù)傳遞規(guī)則不同,如果系統(tǒng)包含浮點運算的硬件部件,浮點參數(shù)將按照下面的規(guī)則傳遞:各個浮點參數(shù)按順序處理;為每個浮點參數(shù)分配FP寄存器;分配的方法是,滿足該浮點參數(shù)需要的且編號最小的一組連續(xù)的FP寄存器。第一個整數(shù)參數(shù)通過寄存器R0~R3來傳遞,其他參數(shù)通過數(shù)據(jù)棧傳遞。
2.4 子程序結果返回規(guī)則
  1. 結果為一個32位的整數(shù)時或小于32位的整數(shù)值以保留符號和符號的方式擴展為32位值的范圍,可以通過寄存器R0返回。

  2. 結果為一個64位整數(shù)時,一個64位整數(shù)值被視為兩個32位整數(shù)值,可以通過R0和R1返回,依此類推。

  3. 對于位數(shù)更多的結果,需要通過調(diào)用內(nèi)存來傳遞,任何其它類型的值(例如結構化值)將轉換為32位整數(shù)字序列,通過將其復制到連續(xù)的內(nèi)存字中。

175d7626-dd5a-11ec-ba43-dac502259ad0.png ?根據(jù)上面簡單的測試可以看出:

	MOVS r2,#0x03 MOVS r1,#0x02 MOVS r0,#0x01 通過寄存器R0~R3來傳遞參數(shù):

	ADDS r0,r3,r1 ADDS r0,r0,r2 通過寄存器R0返回。

3. 特定的ATPCS


3.1 支持數(shù)據(jù)棧限制檢查的ATPCS

如果在程序設計期間能夠準確地計算出程序所需的內(nèi)存總量,就不需要進行數(shù)據(jù)棧的檢查,但是在通常情況下這是很難做到的,這時需要進行數(shù)據(jù)棧的檢查。在進行數(shù)據(jù)棧的檢查時,使用寄存器R10作為數(shù)據(jù)棧限制指針,這時寄存器R10又記作SL。用戶在程序中不能控制該寄存器。具體來說,支持數(shù)據(jù)棧限制的ATPCS要滿足下面的規(guī)則:在已經(jīng)占有的棧的最低地址和SL之間必須有256字節(jié)的空間,也就是說,SL所指的內(nèi)存地址必須比已經(jīng)占用的棧的最低地址低256個字節(jié)。當中斷處理程序可以使用用戶的數(shù)據(jù)棧時,在已經(jīng)占用的棧的最低地址和SL之間除了必須保留的256個字節(jié)的內(nèi)存單元外,還必須為中斷處理預留足夠的內(nèi)存空間;用戶在程序中不能修改SL的值;數(shù)據(jù)棧棧指針SP的值必須不小于SL的值。與支持數(shù)據(jù)棧限制檢查的ATPCS相關的編譯/匯編選項有下面幾種:選項./ swst (編譯過程中對輸入文件使用堆棧檢測)指示編譯器生成的代碼遵守支持數(shù)據(jù)棧限制檢查的ATPCS,用戶在程序設計期間不能夠準確計算程序所需的數(shù)據(jù)棧大小時,需要指定該選項;選項./ noswst (編譯過程中對輸入文件不使用堆棧檢測,這是編譯器默認選項)指示編譯器生成的代碼不支持數(shù)據(jù)棧限制檢查的功能,用戶在程序設計期間能夠準確計算出程序所需的數(shù)據(jù)棧大小,可以指定該選項;選項./ swst如果匯編程序?qū)τ谑欠襁M行數(shù)據(jù)棧檢查無所謂,而與該匯編程序連接的其他程序指定了選項./ swst。對于256字節(jié)或更少的幀,可以按如下方式檢查:

	CMP sp, sl BHS no_ovf BL |__16__rt_stkovf_split_small| no_ovf 對于大于 256 字節(jié)的幀,可以如下方式檢查:

	LDR wr, framesize ADD wr, sp CMP wr, sl BHS no_ovf BL |__16__rt_stkovf_split_big| no_ovf MOV sp,wr ; ... ALIGN Framesize DCD –Framesize 
3.2 編寫遵守支持數(shù)據(jù)棧限制檢查的ATPCS的匯編語言程序
對于C程序和C++程序來說,如果在編譯時指定了選項./swst,生成的目標代碼將遵守支持數(shù)據(jù)棧限制檢查的ATPCS。對于匯編語言程序來說,如果要遵守支持數(shù)據(jù)棧限制檢查的ATPCS,用戶在編寫程序時必須滿足支持數(shù)據(jù)棧限制檢查的ATPCS所要求的規(guī)則,然后指定選項./swst,下面介紹用戶編寫匯編語言程序時的一些要求。178aa7f4-dd5a-11ec-ba43-dac502259ad0.png
3.3 葉子子程序是指不調(diào)用別的程序的子程序
數(shù)據(jù)棧小于256字節(jié)的葉子子程序不許要進行數(shù)據(jù)棧檢查,如果幾個子程序組合起來構成的葉子子程序數(shù)據(jù)棧也小于256字節(jié),這個規(guī)則同樣適用;數(shù)據(jù)棧小于256字節(jié)的非葉子子程序可以使用下面的代碼段來進行數(shù)據(jù)棧檢查。ARM程序使用:

	SUB sp,sp,#size ; #size 為sp和sl之間必須保留的空間大小 CMP sp,sl; BLLO _ARM_stack_overflow THUMB程序使用:

	ADD sp,#-size ; #size為sp和sl之間必須保留的空間大小 CMP sp,sl; BLLO _THUMB_stack_overflow 數(shù)據(jù)棧大于256字節(jié)的子程序,為了保證SP的值不小于數(shù)據(jù)??捎玫膬?nèi)存單元最小的地址值,需要引入相應的寄存器。在使用超過 256 字節(jié)堆??臻g的例程中檢查溢出更為復雜,不能簡單地從SP減去幀大小。在這種情況下,必須使用如下序列向限制檢查代碼建議SP的新值:ARM程序使用下列代碼:

	SUB ip,sp,#size; CMP ip,sl; BLLO _ARM_stack_overflow THUMB程序使用下列代碼:

	LDR wr,#-size; ADD wr,sp; CMP wr,sl; BLLO _THUMB_stack_overflow 在編譯或匯編時,/interwork (指定輸入文件符合ARM/Thumb交互標準)告訴編譯器或匯編器生成的目標代碼遵守支持ARM-THUMB的ATPCS,它用在以下場合:
  • 程序中存在ARM程序調(diào)用THUMB程序的情況

  • 程序中存在THUMB程序調(diào)用ARM程序的情況

  • 需要連接器來進行ARM狀態(tài)和THUMB狀態(tài)切換的情況

在下述情況下使用選項/nointerwork:程序中不包含THUMB程序;用戶自己進行ARM程序和THUMB程序切換。需要注意的是:在同一個C/C++程序中不能同時有ARM指令和THUMB指令。17b3d426-dd5a-11ec-ba43-dac502259ad0.png ?\_\_asm 關鍵字用于調(diào)用內(nèi)聯(lián)匯編程序,可以用在C或C++源碼中內(nèi)嵌匯編語言,如下所示:17e3495e-dd5a-11ec-ba43-dac502259ad0.png ?ATPCS規(guī)則就是定義了函數(shù)傳參以及返回數(shù)據(jù)的標準,定義了寄存器在函數(shù)調(diào)用時的作用。

						

						

						

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140200
  • 函數(shù)
    +關注

    關注

    3

    文章

    4367

    瀏覽量

    64155
  • 系統(tǒng)控制

    關注

    0

    文章

    34

    瀏覽量

    16375

原文標題:技術分享 | Cortex-M0中斷控制和系統(tǒng)控制(七)

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Altium Designer中PCB設計規(guī)則設置

    在使用 Altium Designer 進行PCB設計時,除了電氣間距(Clearance)等基礎規(guī)則外, 導線寬度、阻焊層、內(nèi)電層連接、銅皮敷設等規(guī)則也同樣重要 。這些設置不僅影響布線效率,還決定了成品板的可制造性與可靠性。
    的頭像 發(fā)表于 04-17 13:54 ?2331次閱讀
    Altium Designer中PCB設計<b class='flag-5'>規(guī)則</b>設置

    如何在特定區(qū)域設置線寬、線距規(guī)則

    “ ?今天偷個懶,分享一個 Hayden 大佬提供的自定義規(guī)則,非常實用??梢栽谔囟▍^(qū)域(如BGA器件范圍內(nèi))定義特殊的線寬、線距規(guī)則。? ” 就是下面這段自定義規(guī)則,表示 U10
    的頭像 發(fā)表于 03-19 11:20 ?420次閱讀
    如何在特定區(qū)域設置線寬、線距<b class='flag-5'>規(guī)則</b>

    芯片設計中的設計規(guī)則檢查

    設計規(guī)則檢查(Design Rule Check,簡稱DRC)是芯片設計中的一個關鍵步驟,旨在確保電路設計的物理布局符合制造工藝的要求。可以把它類比為建筑設計中的檢查流程,確保建筑圖紙中的所有尺寸
    的頭像 發(fā)表于 03-04 14:58 ?378次閱讀

    電子線路信號完整性設計規(guī)則

    電子發(fā)燒友網(wǎng)站提供《電子線路信號完整性設計規(guī)則.pdf》資料免費下載
    發(fā)表于 01-21 09:24 ?0次下載
    電子線路信號完整性設計<b class='flag-5'>規(guī)則</b>

    PCB布線和布局電路設計規(guī)則

    常用的PCB設計規(guī)則
    發(fā)表于 11-09 14:10 ?108次下載

    了解TI基于PCB布線規(guī)則的DDR時序規(guī)范

    電子發(fā)燒友網(wǎng)站提供《了解TI基于PCB布線規(guī)則的DDR時序規(guī)范.pdf》資料免費下載
    發(fā)表于 10-15 11:47 ?3次下載
    了解TI基于PCB布線<b class='flag-5'>規(guī)則</b>的DDR時序規(guī)范

    網(wǎng)關的設置規(guī)則

    網(wǎng)關的設置規(guī)則涉及多個方面,包括硬件安裝、網(wǎng)絡連接、基本配置、高級配置以及安全設置等。以下是一篇關于網(wǎng)關設置規(guī)則的詳細指南,旨在幫助用戶正確配置和管理網(wǎng)關設備。
    的頭像 發(fā)表于 09-30 11:48 ?4374次閱讀

    CMOS晶體管的尺寸規(guī)則

    CMOS晶體管尺寸規(guī)則是一個復雜且關鍵的設計領域,它涉及到多個方面的考量,包括晶體管的性能、功耗、面積利用率以及制造工藝等。以下將從CMOS晶體管的基本結構、尺寸對性能的影響、設計規(guī)則以及未來趨勢等方面進行詳細闡述。
    的頭像 發(fā)表于 09-13 14:10 ?3931次閱讀

    AM263x器件命名規(guī)則和子集器件

    電子發(fā)燒友網(wǎng)站提供《AM263x器件命名規(guī)則和子集器件.pdf》資料免費下載
    發(fā)表于 09-04 10:29 ?0次下載
    AM263x器件命名<b class='flag-5'>規(guī)則</b>和子集器件

    AD9元器件間距規(guī)則如何設置

    在Altium Designer 9(簡稱AD9)中設置元器件間距規(guī)則,主要是為了確保PCB(Printed Circuit Board,印刷電路板)上的元器件之間保持適當?shù)木嚯x,以避免短路、干擾或
    的頭像 發(fā)表于 09-02 15:26 ?7880次閱讀

    規(guī)則音頻是一種連續(xù)變化的什么信號

    規(guī)則音頻信號是指在時間上具有一定規(guī)律性的音頻信號,它們通常用于通信、音樂、語音處理等領域。 規(guī)則音頻信號的定義 規(guī)則音頻信號是一種在時間上呈現(xiàn)周期性或準周期性變化的聲波。這種信號可以通過數(shù)學函數(shù)
    的頭像 發(fā)表于 08-25 15:41 ?542次閱讀

    功放ab輸出和雙線分音的規(guī)則

    關于功放AB輸出和雙線分音的規(guī)則,可以分別進行說明: 一、功放AB輸出的規(guī)則 功放AB輸出通常指的是功放機具有兩組獨立的輸出端子(A組和B組),它們可以分別連接不同的音箱或揚聲器系統(tǒng)。以下是功放AB
    的頭像 發(fā)表于 08-23 10:55 ?4140次閱讀

    iptables 工具常用命令規(guī)則有哪些

    iptables 是 Linux 上用于配置 IPv4 數(shù)據(jù)包過濾和 NAT 規(guī)則的工具。它可以讓您控制數(shù)據(jù)包如何在您的 Linux 服務器上進行轉發(fā)、過濾和修改。下面是一些基本的 iptables
    發(fā)表于 06-12 15:42

    高速pcb布線規(guī)則有哪些

    高速pcb布線規(guī)則有哪些 高速PCB布線規(guī)則 摘要:隨著電子技術的快速發(fā)展,高速PCB設計變得越來越重要。為了確保信號完整性和電磁兼容性,遵循一定的布線規(guī)則至關重要。本文將詳細介紹高速PCB布線
    的頭像 發(fā)表于 06-10 17:33 ?1362次閱讀

    射頻PCB設計規(guī)則是什么?

    射頻PCB設計規(guī)則
    發(fā)表于 06-04 08:09