驅(qū)動atpcs規(guī)則詳細(xì)不太好_第1頁
驅(qū)動atpcs規(guī)則詳細(xì)不太好_第2頁
驅(qū)動atpcs規(guī)則詳細(xì)不太好_第3頁
驅(qū)動atpcs規(guī)則詳細(xì)不太好_第4頁
驅(qū)動atpcs規(guī)則詳細(xì)不太好_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

ATPCS寄存器的使用寄存器 R1R2 R4 R8 ATPCS名稱a1 v5 LR在子程序中,使用寄存器R4~R11來保存局部變量。這時,寄存器R4~R11可以記為v1~v8。如果在子程序中使用了寄存器v1~v8中的某些寄存器,則子程序進(jìn)入時必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7來保存局部變量。另外R9,R10和R11還有 個特殊作用,分別記為:靜態(tài)基址寄存器SB,數(shù)據(jù)棧限制指針SL和楨指針FP。寄存器R12用做過程調(diào)用中間臨時寄存器IP。寄存器R13用做堆棧指針SP。在子程序中寄存器R13不能用做其它用途。寄存器SP在進(jìn)入子程序時的值和子程序的值必須相等。寄存器R14稱為寄存器LR,它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14則可以用做其他用途。寄存器R15為程序計(jì)數(shù)器PC,不能用做其他用途。只有寄存器R0~R7,SP,LR和PC可以在Thumb狀態(tài)下使用,其中R7常常作為Thumb狀態(tài)的工作寄存器,記為WR。數(shù)據(jù)棧使用規(guī)則:滿降序棧(FD),且8字節(jié)關(guān)于PCS與ATPCS的點(diǎn)介2008-09-01本文來自網(wǎng)絡(luò),稍作 點(diǎn)編輯如果讀者使用的是ADS1.2編譯器,那么ATPCS.pdf文檔就在X:\ProgramFiles\ARM\ADSv12\PDF\specs 面。(X:\指的是ADS1.2編譯器所在的安裝盤)什么是PCS,什么是PCS即ProcedureCallStandard(過程調(diào)用規(guī)范),ATPCS即ARM-THUMBprocedurecallstandardPCS規(guī)定了應(yīng)用程序的函數(shù)可以如何分開地寫,分開地編譯,最后將它們連接在起,所以它實(shí)際上定義了套有關(guān)過程(函數(shù))調(diào)用者與被調(diào)用者之間的協(xié)議。PCS強(qiáng)制實(shí)現(xiàn)如下約定:調(diào)用函數(shù)如何傳遞參數(shù)(即壓棧方法,以何種方式存放參數(shù)),被調(diào)用函數(shù)如何獲取參數(shù),以何種方式傳遞函數(shù)返回值。PCS的制訂是系列指標(biāo)的“tradeoff(折衷)”(因?yàn)楹艽蟪潭壬仙婕跋到y(tǒng)的 些性能),如會涉及生成代碼的大小,調(diào)試功能的支持,函數(shù)調(diào)用上下文處理速度以及內(nèi)存消耗。當(dāng)然,通過編譯器的支持可以讓生成的代碼有不同的特性,如gcc編譯選項(xiàng)可以支持或不支持framepointer來支持深入調(diào)試功能或提高程序運(yùn)行性能。PCS是體系結(jié)構(gòu)密切相關(guān)的,直接涉及編譯器如何使用處理器提供的應(yīng)用寄存器,如編譯器使用什么寄存器作為棧指針,利用哪些寄存器作直接傳參等。值得注意的是,沒有誰規(guī)定說PCS是必須這樣而不是那樣的。它是應(yīng)用相關(guān)的。任何個操作系統(tǒng)和應(yīng)用可以處于它自身的考慮定義自己的PCS。當(dāng)然,如果那樣,也必須有自己的編譯器。而實(shí)際上,在個處理器設(shè)計(jì)時,都會有某種假設(shè),所以PCS某種程度上應(yīng)該是樣的。ATPCS寄存器的使用規(guī)則:寄存器 R2 ATPCS名稱 a1a2 v5 子程序間通過寄存器R0~R3來傳遞參數(shù)。被調(diào)用的子程序在返回前無須恢復(fù)寄存器R0~R3的內(nèi)容在子 寄存器R4~R11來保存局部變量。這時,寄存器R4~R11可以記為v1~v8。如果在子程序中使用了寄存器v1~v8中的某些寄存器,則子程序進(jìn)入時必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7來保存局部變量。另外R9,R10和R11還有 個特殊作用,分別記為:靜態(tài)基址寄存器SB,數(shù)據(jù)棧限制指針SL和楨指針FP。寄存器R12用做過程調(diào)用中間臨時寄存器IP。寄存器R13用做堆棧指針SP。在子程序中寄存器R13不能用做其它用途。寄存器SP在進(jìn)入子程序時的值和子程序的值必須相等。寄存器R14稱為寄存器LR,它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14則可以用做其他用途。寄存器R15為程序計(jì)數(shù)器PC,不能用做其他用途。只有寄存器R0~R7,SP,LR和PC可以在Thumb狀態(tài)下使用,其中R7常常作為Thumb狀態(tài)的工作寄存器,記為WR。數(shù)據(jù)棧使用規(guī)則:滿降序棧(FD),且8字節(jié)對齊。關(guān)于PCS與ATPCS的 點(diǎn)介紹2008-09-0122:21:50本文來自網(wǎng)絡(luò) 稍作 點(diǎn)編輯如果讀者使用的是ADS1.2編譯器,那么ATPCS.pdf文檔就在X:\ProgramFiles\ARM\ADSv12\PDF\specs 什么是PCS,什么是PCS即ProcedureCallStandard(過程調(diào)用規(guī)范),ATPCS即ARM-THUMBprocedurecallstandardPCS規(guī)定了應(yīng)用程序的函數(shù)可以如何分開地寫,分開地編譯,最后將它們連接在 起,所以它實(shí)際上定義了 套有關(guān)過程(函數(shù))調(diào)用者與被調(diào)用者之間的協(xié)議。PCS強(qiáng)制實(shí)現(xiàn)如下約定:調(diào)用函數(shù)如何傳遞參數(shù)(即壓棧方法,參數(shù)),被調(diào)用函數(shù)如何獲取參數(shù),以何種方式傳遞函數(shù)返回值。PCS的制訂 系列指的“tradeoff(折衷)”(因?yàn)楹艽蟪潭壬仙婕跋到y(tǒng)的 些性能),如會涉及生成代碼的大小,調(diào)試功能的支持,函數(shù)調(diào)用上下文處理速度以及內(nèi)存消耗。當(dāng)然,通過編譯器的支持可以讓生成的代碼有不同的特性,如gcc編譯選項(xiàng)可以支持或不支持framepointer來支持深入調(diào)試功能或提高程序運(yùn)行性能。PCS是體系結(jié)構(gòu)密切相關(guān)的,直接涉及編譯器如何使用處理器提供的應(yīng)用寄存器,如編譯器使用什么寄存器作為棧指針,利用哪些寄存器作直接傳參等。值得注意的是,沒有誰規(guī)定說PCS是必須這樣而不是那樣的。它是應(yīng)用相關(guān)的。任何個操作系統(tǒng)和應(yīng)用可以處于它自身的考慮定義自己的PCS。當(dāng)然,如果那樣,也必須有自己的編譯器。而實(shí)際上,在個處理器設(shè)計(jì)時,都會有某種假設(shè),所以PCS某種程度上應(yīng)該是樣的。寄存器的使用必須滿足下面的規(guī)則子程序間通過寄存器R0R3來傳遞參數(shù),這時,寄存器R0R3可以記作A1-A4。被調(diào)用的子程序在返回前無復(fù)寄存器R0-R3的內(nèi)在子程序中,使用寄存器R4R11來保存局部變量.這時,寄存器R4-R11可以記作V1-V8。如果在子程序中使用到了寄存器V1-V8中的某些寄存器,子程序進(jìn)入時必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值;對于子程序中沒有用到的寄存器則不必進(jìn)行這些操作。在Thumb程序中,通常只能使用寄存器R4-R7來保存局部變量。寄存器R12用作子程序間scratch寄存器(用于保存SP,在函數(shù)返回時使用該寄存器出棧),記作ip。在序間的連接代碼段中常有這種使用規(guī)寄存器R13用作數(shù)據(jù)棧指針,記作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在進(jìn)入子程值和子程序時的值必須相等寄存器R14稱為連接寄存器,記作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄器R14則可以用作其他用寄存器R15是程序計(jì)數(shù)器,記作pc。它不能用作其ATPCS規(guī)則(2008-10-2116:04:14):atpcsarm雜 分類:嵌入式基本基本ATPCS規(guī)定了在子程序調(diào)用時的些基本規(guī)則,包括以下三個方面的內(nèi)容:各寄存器的使用規(guī)則及其相應(yīng)的名字;數(shù)據(jù)棧的使用規(guī)則;參數(shù)傳遞的規(guī)則.相對于其他類型的ATPCS,滿足基本ATPCS的程序的執(zhí)行速度更快,所占用的內(nèi)存更少.但是它不能提供以下的支持:ARM程序和THUMB程序相用;數(shù)據(jù)以及代碼的位置無關(guān)的支持;子程序的可重入性;數(shù)據(jù)棧檢查的支持.而派生的其他幾種特定的ATPCS就是在基本ATPCS的基礎(chǔ)上再添加其他的規(guī)則而形成的.其目的就是提供上述的功能...寄存器的使用規(guī)子程序通過寄存器R0~R3來傳遞參數(shù).這時寄存器可以記作:A0~A3,被調(diào)用的子程序在返恢復(fù)寄存器R0~R3的內(nèi)容.在子程序中,使用R4~R11來保存局部變量,這時寄存器R4~R11可以記作:V1~V8.如果在子程序中使用到V1~V8的某些寄存器,子程序進(jìn)入時必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值,對于子程序中沒有用到的寄存器則不必執(zhí)行這些操作.在THUMB程序中,通常只能使用寄存器R4~R7來保存局部變量.寄存器R12用作子程序間scratch寄存器,記作ip;在子程序的連接代碼段中經(jīng)常會有這種使用寄存器R13用作數(shù)據(jù)棧指針,記做SP,在子程序中寄存器R13不能用做其他用途.寄存器SP在進(jìn)時的值和子程序時的值必須相等寄存器R14用作連接寄存器,記作lr;它用于保存子程序的返回地址,如果在子程序中保存了返回地址則R14可用作其它的用途寄存器R15是程序計(jì)數(shù)器,記作PC;它不能用作其他ATPCS中的各寄存器在ARM編譯器和匯編器中都是預(yù)定義的數(shù)據(jù)棧的使用規(guī)棧指針通??梢灾赶虿煌奈恢?當(dāng)棧指針指向棧頂元素(即最后個入棧的數(shù)據(jù)元素)時,稱為FULL棧.當(dāng)棧指針指向與棧頂元素相鄰的個元素時,稱為Empty棧.數(shù)據(jù)棧的增長方向也可以不同.當(dāng)數(shù)據(jù)棧向內(nèi)存減小的地址方向增長時,稱為Descending棧;當(dāng)數(shù)據(jù)棧向著內(nèi)存地址增加的方向增長時,稱為Ascending棧.綜合這兩種特點(diǎn)可以由以下4種數(shù)據(jù)棧:FDEDFAEA.ATPCS規(guī)定數(shù)據(jù)棧為FD類型,并對數(shù)據(jù)棧的操作是8字節(jié)對齊的,下面是個數(shù)據(jù)棧的示例及相關(guān)的名詞.數(shù)據(jù)棧棧指針.stackpointer指向最后個寫入棧的數(shù)據(jù)的內(nèi)存地址數(shù)據(jù)棧的址.stackbase是指數(shù)據(jù)棧的最高地址.由于ATPCS中的數(shù)據(jù)棧是FD類型的,實(shí)際上數(shù)棧中最早入棧數(shù)據(jù)占據(jù)的內(nèi)存單元是址的下個內(nèi)存單元數(shù)據(jù)棧界限.stacklimit是指數(shù)據(jù)棧中可以使用的最低的內(nèi)存單元地址寄存器的使用規(guī)則:寄存器的使用必須滿足下面的規(guī)則序間通過寄存器R0R3來傳遞參數(shù),這時,寄存器R0R3可以記作A1-A4。被調(diào)用的序在返回前無需恢復(fù)寄存器R0-R3的內(nèi)容。在序中,使用寄存器R4R11來保存局部變量.這時,寄存器R4-R11可以記作V1-V8。如果在序中使用到了寄存器V1-V8中的某些寄存器,序進(jìn)入時必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值;對于序中沒有用到的寄存器則不必進(jìn)行這些操作。在Thumb只能使用寄存器R4-R7來保存局部變量。寄存器R12用作序間scratch寄存器(用于保存SP,在函數(shù)返回時使用該寄存器出棧),記作ip。在序間的連接代碼段中常有這種使用規(guī)則。寄存器R13用作數(shù)據(jù)棧指針,記作sp。在序中寄存器R13不能用作其他用途。寄存器sp在進(jìn)入序時的值和 序時的值必須相等。寄存器R14稱為連接寄存器,記作lr。它用于保存序的返回地址。如果在序中保存了返回地址,寄存器R14則可以用作其他用途。寄存器R15是程序計(jì)數(shù)器,記作pc。它不能用作其他用途。ATPCS規(guī)則(2008-10-2116:04:14):atpcsarm雜談 分類:嵌入式ARM基本ATPCS...基本ATPCS規(guī)定了在序調(diào)用時的 些基本規(guī)則,包括以下三個方面的內(nèi)容:各寄存器的使用規(guī)則及其相應(yīng)的名字;數(shù)據(jù)棧的使用規(guī)則;參數(shù)傳遞的規(guī)則.相對于其他類型的ATPCS,滿足基本ATPCS的程序的執(zhí)行速度更快,所占用的內(nèi)存更少.但是它不能提供以下的支持:ARM程序和THUMB程序相用;數(shù)據(jù)以及代碼的位置無關(guān)的支持;序的可重入性;數(shù)據(jù)棧檢查的支持.而派生的其他幾種特定的ATPCS就是在基本ATPCS的基礎(chǔ)上再添加其他的規(guī)則而形成的.其目的就是提供上述的功能...寄存器的使用規(guī)則:序通過寄存器R0~R3來傳遞參數(shù).這時寄存器可以記作:A0~A3,被調(diào)用的序在返回前無需恢復(fù)寄存器R0~R3的內(nèi)容.在序中,使用R4~R11來保存局部變量,這時寄存器R4~R11可以記作:V1~V8.如果在序中使用到V1~V8的某些寄存器,序進(jìn)入時必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值,對于序中沒有用到的寄存器則不必執(zhí)行這些操作.在THUMB程序中,通常只能使用寄存器R4~R7來保存局部變量.寄存器R12用 atch寄存器,記作ip;在序的連接代碼段中經(jīng)常會有這種使用規(guī)則寄存器R13用作數(shù)據(jù)棧指針,記做SP,在序中寄存器R13不能用做其他用途.寄存器SP在進(jìn)入序時的值和 序時的值必須相等.寄存器R14用作連接寄存器,記作lr;它用于保存序的返回地址,如果在序中保存了返回地址,則R14可用作其它的用途.寄存器R15是程序計(jì)數(shù)器,記作PC;它不能用作其他用途.ATPCS中的各寄存器在ARM編譯器和匯編器中都是預(yù)定義的.數(shù)據(jù)棧的使用規(guī)則棧指針通??梢灾赶虿煌奈恢?當(dāng)棧指入棧的數(shù)據(jù)元素)時,稱為FULL棧.當(dāng)棧指針指向與棧頂元素相鄰的個元素時,稱為Empty棧.數(shù)據(jù)棧的增長方向也可以不同.當(dāng)數(shù)據(jù)棧向內(nèi)存減小的地址方向增長時,稱為Descending棧;當(dāng)數(shù)據(jù)棧向著內(nèi)存地址增加的方向增長時,稱為Ascending棧.綜合這兩種特點(diǎn)可以由以下4種數(shù)據(jù)棧:FDEDFAEA.ATPCS規(guī)定數(shù)據(jù)棧為FD類型,并對數(shù)據(jù)棧的操作是8字節(jié)對齊的,下面是個數(shù)據(jù)棧的示例及相關(guān)的名詞.數(shù)據(jù)棧棧指針.stackpointer指向最后個寫入棧的數(shù)據(jù)的內(nèi)存地址數(shù)據(jù)棧的址.stackbase是指數(shù)據(jù)棧的最高地址.由于ATPCS中的數(shù)據(jù)棧是FD類型的,實(shí)際上數(shù)據(jù)棧中最早入棧數(shù)據(jù)占據(jù)的內(nèi)存單元是址的下個內(nèi)存單元.數(shù)據(jù)棧界限.stacklimit是指數(shù)據(jù)棧中可以使用的最低的內(nèi)存單元地址已占用的數(shù)據(jù)棧.usedstack是指數(shù)據(jù)棧的址和數(shù)據(jù)棧棧指針之間的區(qū)域.其中包括數(shù)據(jù)棧棧指對應(yīng)的內(nèi)存單數(shù)據(jù)棧中的數(shù)據(jù)幀 是指在數(shù)據(jù)棧中,為序分配的用來保存寄存器和局部變量的域異常中斷的處理程序可以使用被中斷程序的數(shù)據(jù)棧,這時用戶要保證中斷的程序數(shù)據(jù)棧足夠大 使用ADS譯器產(chǎn)生的目標(biāo)代碼中包含了DRFAT2格式的數(shù)據(jù)幀.在調(diào)試過程中,調(diào)試器可以使用這些數(shù)據(jù)幀來查看數(shù)據(jù)相關(guān)信息.而對于匯編語言來說,用戶必須使用FRAME偽操作來描述數(shù)據(jù)棧中的數(shù)據(jù)幀.ARM匯編器根據(jù)這些偽操作在目標(biāo)文件中產(chǎn)生相應(yīng)的DRFAT2格式的數(shù)據(jù)幀.在ARMv5TE中,批量傳送指令LDRD/STRD要求數(shù)據(jù)棧是8字節(jié)對齊的,以提高數(shù)據(jù)的傳送速度.用ADS編譯器產(chǎn)生的目標(biāo)文件中,外部接口的數(shù)據(jù)棧都是8字節(jié)對齊的,并且編譯器將告訴連接器:本目標(biāo)文件中的數(shù)據(jù)棧是8字節(jié)對齊的.而對于匯編程序來說,如果目標(biāo)文件中包含了外部調(diào)用,則必須滿足以下條件:外部接口的數(shù)據(jù)棧 定是位對齊的,也就是要保證在進(jìn)入該匯編代碼后,直到該匯編程序調(diào)用外部代碼之間,數(shù)據(jù)棧的棧指針變化為偶數(shù)個字;在匯編程序中使用PRESERVE8偽操作告訴連接器,本匯編程序是8字節(jié)對齊的.參數(shù)的傳遞規(guī)則根據(jù)參數(shù)個數(shù)是否固定,可以將序分為參數(shù)個數(shù)固定的序和參數(shù)個數(shù)可變的序.這 程的參數(shù)傳遞規(guī)則是不同的參數(shù)個數(shù)可變的序參數(shù)傳遞規(guī)對于參數(shù)個數(shù)可變的序,當(dāng)參數(shù)不超過4個時,可以使用寄存器R0~R3來進(jìn)行參數(shù)傳遞,當(dāng)參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù).在參數(shù)傳遞時,將所有參數(shù)看做是存放在連續(xù)的內(nèi)存單元中的字?jǐn)?shù)據(jù)。然后,依次將各名字?jǐn)?shù)據(jù)傳送到寄存器R0,R1,R2,R3;如果參數(shù)多于4個,將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后個字?jǐn)?shù)據(jù)先入棧.按照上面的規(guī)則 個浮點(diǎn)數(shù)參數(shù)可以通過寄存器傳遞,也可以通過數(shù)據(jù)傳遞,也可 半通過寄存器傳遞, 半通過數(shù)據(jù)棧傳遞參數(shù)個數(shù)固定的序參數(shù)傳遞規(guī)對于參數(shù)個數(shù)固定的序,參數(shù)傳遞與參數(shù)個數(shù)可變的序參數(shù)傳遞規(guī)則不同,如果系統(tǒng)包含浮點(diǎn)運(yùn)算的硬件部件,浮點(diǎn)參數(shù)將按照下面的規(guī)則傳遞:各個浮點(diǎn)參數(shù)按順序處理;為每個浮點(diǎn)參數(shù)分配FP寄存器;分配的方法是,滿足該浮點(diǎn)參數(shù)需要的且編號最小的組連續(xù)的FP寄存器.第個整數(shù)參數(shù)通過寄存器R0~R3來傳遞,其他參數(shù)通過數(shù)據(jù)棧傳遞.序結(jié)果返回結(jié)果 個32位的整數(shù)時,可以通過寄存器R0返回結(jié)果 個64位整數(shù)時,可以通過R0和R1返回,依此類推結(jié)果 個浮點(diǎn)數(shù)時,可以通過浮點(diǎn)運(yùn)算部件的寄存器f0,d0或者s0來返回結(jié)果 個復(fù)合的浮點(diǎn)數(shù)時,可以通過寄存器f0-fN或者d0~dN來返回對于位數(shù)的結(jié)果,需要通過調(diào)用內(nèi)存來傳遞三.幾種特定的A.支持?jǐn)?shù)據(jù)棧限制檢查的如果在程序設(shè)計(jì)期間能夠準(zhǔn)確地計(jì)算出程序所需的內(nèi)存總量,就不需要進(jìn)行數(shù)據(jù)棧的檢查,但是在通常情況下這是很難做到的,這時需要進(jìn)行數(shù)據(jù)棧的檢查.在進(jìn)行數(shù)據(jù)棧的檢查時,使用寄存器R10作為數(shù)據(jù)棧限制指針,這時寄存器R10又記作sl.用戶在程序中不能控制該寄存器.具體來說,支持?jǐn)?shù)據(jù)棧限制的ATPCS要滿足下面的規(guī)則:在已經(jīng)占有的棧的最低地址和sl之間必須有256字節(jié)的空間,也就是說,sl所指的內(nèi)存地址必須比已經(jīng)占用的棧的最低地址低256個字節(jié).當(dāng)中斷處理程序可以使用用戶的數(shù)據(jù)棧時,在已經(jīng)占用的棧的最低地址和sl之間除了必須保留的256個字節(jié)的內(nèi)存單元外,還必須為中斷處理預(yù)留足夠的內(nèi)存空間;用戶在程序中不能修改sl的值;數(shù)據(jù)棧棧指針sp的值必須不小于sl的值.與支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS相關(guān)的編譯/匯編選項(xiàng)有下面幾種:選項(xiàng) 指示編譯器生成的代碼遵支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS,用戶在程序設(shè)計(jì)期間不能夠準(zhǔn)確計(jì)算程序所需的數(shù)據(jù)棧大小時,需要指定該選項(xiàng);選/noswst指示編譯器生成的代碼不支持?jǐn)?shù)據(jù)棧限制檢查的功能,用戶在程序設(shè)計(jì)期間能夠準(zhǔn)確計(jì)算出程序所需的數(shù)據(jù)棧大小,可以指定該選項(xiàng),這個選項(xiàng)是默認(rèn)的;選項(xiàng)/SWSTNA如果匯編程序?qū)τ谑欠襁M(jìn)行數(shù)據(jù)棧檢查無所謂,而與該匯編程序連接的其他程序指定了選項(xiàng)swst/noswst,這時使用該選項(xiàng).已占用的數(shù)據(jù)棧.usedstack是指數(shù)據(jù)棧的址和數(shù)據(jù)棧棧指針之間的區(qū)域.其中包括數(shù)據(jù)棧棧指針對應(yīng)的內(nèi)存單元.數(shù)據(jù)棧中的數(shù)據(jù)幀(stackframes)是指在數(shù)據(jù)棧中,為序分配的用來保存寄存器和局部變量的域異常中斷的處理程序可以使用被中斷程序的數(shù)據(jù)棧,這時用戶要保證中斷的程序數(shù)據(jù)棧足夠大.使用ADS譯器產(chǎn)生的目標(biāo)代碼中包含了DRFAT2格式的數(shù)據(jù)幀.在調(diào)試過程中,調(diào)試器可以使用這些數(shù)據(jù)幀來查看數(shù)據(jù)棧中的相關(guān)信息.而對于匯編語言來說,用戶必須使用FRAME偽操作來描述數(shù)據(jù)棧中的數(shù)據(jù)幀.ARM匯編器根據(jù)這些偽操作在目標(biāo)文件中產(chǎn)生相應(yīng)的DRFAT2格式的數(shù)據(jù)幀.在ARMv5TE中,批量傳送指令LDRD/STRD要求數(shù)據(jù)棧是8字節(jié)對齊的,以提高數(shù)據(jù)的傳送速度.用ADS編譯器產(chǎn)生的目標(biāo)文件中,外部接口的數(shù)據(jù)棧都是8字節(jié)對齊的,并且編譯器將告訴連接器:本目標(biāo)文件中的數(shù)據(jù)棧是8字節(jié)對齊的.而對于匯編程序來說,如果目標(biāo)文件中包含了外部調(diào)用,則必須滿足以下條件:外部接口的數(shù)據(jù)棧 定是位對齊的,也就是要保證在進(jìn)入該匯編代碼后,直到該匯編程序調(diào)用外部代碼之間,數(shù)據(jù)棧的棧指針變化為偶數(shù)個字;在匯編程序中使用PRESERVE8偽操作告訴連接器,本匯編程序是8字節(jié)對齊的.參數(shù)的傳遞規(guī)則根據(jù)參數(shù)個數(shù)是否固定,可以將序分為參數(shù)個數(shù)固定的序和參數(shù)個數(shù)可變的 的參數(shù)傳遞規(guī)則是不同的.參數(shù)個數(shù)可變的序參數(shù)傳遞規(guī)對于參數(shù)個數(shù)可變的序,當(dāng)參數(shù)不超過4個時,可以使用寄存器R0~R3來進(jìn)行參數(shù)傳遞,當(dāng)參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù).在參數(shù)傳遞時,將所有參數(shù)看做是存放在連續(xù)的內(nèi)存單元中的字?jǐn)?shù)據(jù)。然后,依次將各名字?jǐn)?shù)據(jù)傳送到寄存器R0,R1,R2,R3;如果參數(shù)多于4個,將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后 個字?jǐn)?shù)據(jù)先入棧.按照上面的規(guī)則, 個浮點(diǎn)數(shù)參數(shù)可以通過寄存器傳遞,也可以通過數(shù)據(jù)棧傳遞,也可能 半通過寄存器傳遞,另 半通過數(shù)據(jù)棧傳遞.參數(shù)個數(shù)固定的序參數(shù)傳遞規(guī)對定的序,參數(shù)傳遞與參數(shù)個數(shù)可變的序參數(shù)傳遞規(guī)則不同,如果系統(tǒng)包含浮點(diǎn)運(yùn)算的硬件部件,浮點(diǎn)參數(shù)將按照下面的規(guī)則傳遞:各個浮點(diǎn)參數(shù)按順序處理;為每個浮點(diǎn)參數(shù)分配FP寄存器;分配的方法是,滿足該浮點(diǎn)參數(shù)需要的且編號最小的 組連續(xù)的FP寄存器.第 個整數(shù)參數(shù)通過寄存器R0~R3來傳遞,其他參數(shù)通過數(shù)據(jù)棧傳遞.規(guī)則結(jié)果 個32位的整數(shù)時,可以通過寄存器R0返回結(jié)果 個64位整數(shù)時,可以通過R0和R1返回,依此類推結(jié)果 個浮點(diǎn)數(shù)時,可以通過浮點(diǎn)運(yùn)算部件的寄存器f0,d0或者s0來返回結(jié)果 個復(fù)合的浮點(diǎn)數(shù)時,可以通過寄存器f0-fN或者d0~dN來返回對于位數(shù)的結(jié)果,需要通過調(diào)用內(nèi)存來傳遞.三.幾種特定的ATPCS...A.支持?jǐn)?shù)據(jù)棧限制檢查的如果在程序設(shè)計(jì)期間能夠準(zhǔn)確地計(jì)算出程序所需的內(nèi)存總量,就不需要進(jìn)行數(shù)據(jù)棧的檢查,但是在通常情況下這是很難做到的,這時需要進(jìn)行數(shù)據(jù)棧的檢查.在進(jìn)行數(shù)據(jù)棧的檢查時,使用寄存器R10作為數(shù)據(jù)棧限制指針,這時寄存器R10又記作sl.用戶在程序中不能控制該寄存器.具體來說,支持?jǐn)?shù)據(jù)棧限制的ATPCS要滿足下面的規(guī)則:在已經(jīng)占有的棧的最低地址和sl之間必須有256字節(jié)的空間,也就是說,sl所指的內(nèi)存地址必須比已經(jīng)占用的棧的最低地址低256個字節(jié).當(dāng)中斷處理程序可以使用用戶的數(shù)據(jù)棧時,在已經(jīng)占用的棧的最低地址和sl之間除了必須保留的256個字節(jié)的內(nèi)存單元外,還必須為中斷處理預(yù)留足夠的內(nèi)存空間;用戶在程序中不能修改sl的值;數(shù)據(jù)棧棧指針sp的值必須不小于sl的值.與支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS相關(guān)的編譯/匯編選項(xiàng)有下面幾種:選項(xiàng)/SWST指示編譯器生成的代碼遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS,用戶在程序設(shè)計(jì)期間不能夠準(zhǔn)確計(jì)算程序所需的數(shù)據(jù)棧大小時,需要指定該選項(xiàng);選項(xiàng)/noswst指示編譯器生成的代碼不支持?jǐn)?shù)據(jù)棧限制檢查的功能,用戶在程序設(shè)計(jì)期間能夠準(zhǔn)確計(jì)算出程序所需的數(shù)據(jù)棧大小,可以指定該選項(xiàng),這個選項(xiàng)是默認(rèn)的;選項(xiàng)/SWSTNA如果匯編程序?qū)τ谑欠襁M(jìn)行數(shù)據(jù)棧檢查無所謂,而與該匯編程序連接的其他程序指定了選項(xiàng)swst/noswst,這時使用該選項(xiàng).編寫遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS的匯編語言程對于C程序和C++程序來說,如果在編譯時指定了選項(xiàng)SWST,生成的目標(biāo)代碼將遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS.對于匯編語言程序來說,如果要遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS,用戶在編寫程序時必須滿足支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS所要求的規(guī)則,然后指定選項(xiàng)SWST,下面介紹用戶編寫匯編語言程序時的些要求.葉子序是指不調(diào)用別的程序的序數(shù)據(jù)棧小于256字節(jié)的葉子序不許要進(jìn)行數(shù)據(jù)棧檢查,如果幾個序組合起來構(gòu)成的葉子序數(shù)據(jù)棧也小于256字節(jié),這個規(guī)則同樣適用;數(shù)據(jù)棧小于256字節(jié)的非葉子序可以使用下面的代碼段來進(jìn)行數(shù)據(jù)棧檢查.ARM程序使用:SUBsp,sp,#size;#size為sp和sl之間必須保留的空間大CMPBLLOARMstackTHUMB程序使用:ADDsp,#-size;#size為sp和sl之間必須保留的空間大CMPBLLOTHUMBstack數(shù)據(jù)棧大于256字節(jié)的序,為了保證sp的值不小于數(shù)據(jù)棧可用的內(nèi)存單元最小的地址值,需要引入相的寄存器.ARM程序使用下列代碼 THUMB程序使用下列代碼:LDRwr,#-支持只讀段位置無關(guān)的ATPCS...支持ARM程序和THUMB程序混合使用的

CMPBLLOARMstackCMPBLLOTHUMBstack在編譯或匯編時,使用/intework告訴編譯器或匯編器生成的目標(biāo)代碼遵守支持ARM程序和THUMB程序用的ATPCS,它用在以下場合:程序中存在ARM程序調(diào)用THUMB程序的情況;程序中存在THUMB程序調(diào)用ARM程序的情況需要連接器來進(jìn)行ARM狀態(tài)和THUMB狀態(tài)切換的情況;.在下述情況下使用選項(xiàng)nointerwork:程序中不包含THUMB程序;用戶自己進(jìn)行ARM程序和THUMB程序切換.需要注意的是:在同 個C/C++程序中不能同時有ARM指令和THUMB指令.處理浮點(diǎn)運(yùn)算的ATPCS規(guī)則1(2008-10-2115:56:12):atpcs規(guī)則雜 分類:嵌入式參數(shù)傳遞規(guī)參數(shù)不超過4個時,可以使用寄存器R0~R3來傳遞參數(shù),當(dāng)參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù)。結(jié)果 個32位整數(shù)時,可以通過寄存器R0返結(jié)果 個64位整數(shù)時,可以通過寄存器R0和R1返回,依次類推匯編程序、C程序及C++程序 C程序調(diào)用匯編程序匯編程序的設(shè)置要遵循ATPCS規(guī)則,保證程序調(diào)用時參數(shù)的正確傳遞在匯編程序中使用EXPORT偽指令本序,使其它程序可以調(diào)用 在 語言程序中使用 關(guān)鍵字外部函數(shù)(要調(diào)用的匯編序),即可調(diào)用此匯編序調(diào)用匯編的C函數(shù): 對序和C++程序來說,如果在編譯時指定了選項(xiàng)SWST,生成的目標(biāo)代碼將遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS.對于匯編語言程序來說,如果要遵守支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS,用戶在編寫程序時必須滿足支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS所要求的規(guī)則,然后指定選項(xiàng)SWST,下面介紹用戶編寫匯編語言程序時的些要求.葉子序是指不調(diào)用別的程序的序數(shù)據(jù)棧小于256字節(jié)的葉子序不許要進(jìn)行數(shù)據(jù)棧檢查,如果幾個序組合起來構(gòu)成的葉子序數(shù)據(jù)棧也小于256字節(jié),這個規(guī)則同樣適用;數(shù)據(jù)棧小于256字節(jié)的非葉子序可以使用下面的代碼段來進(jìn)行數(shù)據(jù)棧檢查.ARM程序使用:SUBsp,sp,#size;#size為sp和sl之間必須保留的空間大小CMPsp,sl; ARMstackTHUMB程序使用:ADDsp,#-size;#size為sp和sl之間必須保留的空間大CMP THUMBstack數(shù)據(jù)棧大于256字節(jié)的 證sp的值不小于數(shù)據(jù)棧可用的內(nèi)存單元最小的地址值,需要引入相應(yīng)的寄存器.ARM程序使用下列代碼:SUBTHUMB程序使用下列代碼:LDRwr,#-支持只讀段位置無關(guān)的ATPCS...支持ARM程序和THUMB程序混合使用的

CMP ARMstackADDwr,sp;CMP THUMBstack在編譯或匯編時,使用/intework告訴編譯器或匯編器生成的目標(biāo)代碼遵守支持ARM程序和THUMB程序混合使用的ATPCS,它用在以下場合:程序中存在ARM程序調(diào)用THUMB程序的情況;程序中存在THUMB程序調(diào)用ARM程序的情況;需要連接器來進(jìn)行ARM狀態(tài)和THUMB狀態(tài)切換的情況;.在下述情況下使用選項(xiàng)nointerwork:程序中不包含THUMB行ARM程序和THUMB程序切換.需要注意的是:在同 個C/C++指令和THUMB指令.處理浮點(diǎn)運(yùn)算的ATPCS規(guī)則1(2008-10-2115:56:12):atpcs規(guī)則雜 分類:嵌入式參數(shù)傳遞規(guī)參數(shù)不超過4個時,可以使用寄存器R0~R3來傳遞參數(shù),當(dāng)參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù)。結(jié)果為 個32位整數(shù)時,可以通過寄存器R0返回結(jié)果為 個64位整數(shù)時,可以通過寄存器R0和R1返回,依次類推。匯編程序、C程序及C++程序相用C程序調(diào)用匯編程序匯編遵循ATPCS規(guī)則,保證程序調(diào)用時參數(shù)的正確傳遞在匯編程序中使用EXPORT偽指令本序,使其它程序可以調(diào)用此序在C語言程序中使用extern關(guān)鍵字外部函數(shù)(要調(diào)用的匯編序),即可調(diào)用此匯編序調(diào)用匯編的C函數(shù):示例#externvoidstrcopy(char*d,constchar*s)//外部函數(shù),即要調(diào)用的匯 int{constchar*srcstr=“Firststring-source”;//定義字符chardstsrt[]=“Secondstring-destination”;//定義字符串變量printf(“Beforecopying:\n”);printf(“’%s’\n‘%s\n,”srcstr,dststr);//顯示源字符串和目標(biāo)字符串的內(nèi)容strcopy(dststr,srcstr);//調(diào)用匯編序,R0=dststr,R1=srcstrprintf(“Aftercopying:\n”)printf(“’%s’\n‘%s\n,”srcstr,dststr);//顯示 字符串結(jié)}被調(diào)用匯編序AREAEXPORTstrcopy;匯編程序strcopy,以便外部程序strcopy ;R0為目標(biāo)字符串的地址;R1為源字符串的地址LDRBR2,[R1],#1;字節(jié)數(shù)據(jù),源地址加STRBR2,[R0],#1;保存的1字節(jié)數(shù)據(jù),目標(biāo)地址加1CMPr2,#0 ;判斷字符串是否完畢BNE ;沒有完畢,繼續(xù)循MOV ;匯編程序調(diào)用C程匯編程序的設(shè)置要遵循ATPCS規(guī)則,保證程序調(diào)用時參數(shù)的正確傳在匯編程序中使用IMPORT偽指令將要調(diào)用的C程序函數(shù)在調(diào)用C程序時,要正確設(shè)置參數(shù),然后使用BL調(diào)用匯編調(diào)用C程序的C函數(shù):intsum5(inta,litb,intc,intd,int{return(a+b+c+d+e);/5個變量}匯編調(diào)用C程序的匯編程AREAaplIMPORT ;外部標(biāo)號sum5,即C函數(shù)

STMFD {LR};LR寄存ADDR1,R0,R0 ;設(shè)置sum5函數(shù) 參數(shù),R0為參數(shù)aADDR2,R1,R0 ;R1為參數(shù)b,R2為參數(shù)cADDSTRR3,[SP,#- 參數(shù)e要通過堆棧傳 ;R3為參數(shù)BLsum5 ;調(diào)用um5結(jié)果保存在R0ADDSP,SP#4 ;修正SP指針LDMFD ;序返externvoidstrcopy(char*d,constchar*s)//外部函數(shù),即要調(diào)用的匯序int{constchar*srcstr=“Firststring-source”;//定義字符串常量chardstsrt[]=“Secondstring-destination”;//定義字符串變量printf(“Beforecopying:\n”);printf(“’%s’\n‘%s\n,”srcstr,dststr);//顯示源字符串和目標(biāo)字符串的內(nèi)容strcopy(dststr,srcstr);//調(diào)用匯編序,R0=dststr,R1=srcstrprintf(“Aftercopying:\n”)printf(“’%s’\n‘%s\n,”srcstr,dststr);//顯示strcopy字符串結(jié)果}被調(diào)用匯編序 EXPORTstrcopy ;匯編程序strcopy,以便外部程序 ;R0為目標(biāo)字符串的地址;R1為源字符串的地址;LDRBR2,[R1],#1;字節(jié)數(shù)據(jù),源地址加1STRBR2,[R0],#1;保存的1字節(jié)數(shù)據(jù),目標(biāo)地址加1CMPr2,#0 ;判斷字符串是否完畢BNEstrcopy ;沒有完畢,繼續(xù)循環(huán)MOVpc,lr ;返回匯編程序調(diào)用C程匯編遵循ATPCS規(guī)則,保證程序調(diào)用時參數(shù)的正確傳遞在匯編程序中使用IMPORT偽指令將要調(diào)用的C程序函數(shù)在調(diào)用C程序時,要正確設(shè)置參數(shù),然后使用BL調(diào)用匯編調(diào)用C程序的C函數(shù):intsum5(inta,litb,intc,intd,int{return(a+b+c+d+e);//返回5個變量的和}匯編調(diào)用C程序的匯編程序 sampleCODE,READONLYIMPORT ;外部標(biāo)號sum5,即C函數(shù)

STMFD {LR};LR寄存器放棧ADDR1,R0,R0 ;設(shè)置sum5函數(shù)參數(shù),R0為參數(shù)aADDR2,R1,R0 ;R1為參數(shù)b,R2為參數(shù)cADDSTRR3,[SP,#-4]! ;參數(shù)e要通過堆棧傳遞ADDR3,R1,R1 ;R3為參數(shù)dBLsum5 ;調(diào)用sum5(),結(jié)果保存在R0ADDSP,SP#4 ;修正SP指針LDMFD ;序返嵌入式C編程概述:C語言的優(yōu)點(diǎn)是運(yùn)行速度快、編譯效率高、植性好和可讀性強(qiáng)。C語言支持模塊化程序設(shè)計(jì),支持自頂向下的結(jié)構(gòu)化程序設(shè)計(jì)設(shè)計(jì)中經(jīng)嵌入式C語言程序設(shè)計(jì)是利用基本的C語言知識,面向嵌入式工程實(shí)際應(yīng)用進(jìn)行程序設(shè)計(jì)。也就是說它首先是C語言程序設(shè)計(jì),因此必須符合C語言基本語法,只是它是面向嵌入式的應(yīng)用而設(shè)計(jì)的程序。C語言的“預(yù)處理偽指令”在嵌入式程序設(shè)計(jì)中的應(yīng)用。1、文件包含偽指令格式#lude <頭文件名.h> ;標(biāo)準(zhǔn)頭文件#lude “頭文件名.h” ;自定義頭文件2、宏定義偽指令格式#define 宏標(biāo)識符 例: 3、條件宏:先測試是否定義過某宏標(biāo)識符,然后決定如何處理。這樣做是為了避免重復(fù)定義。格式: 宏標(biāo)識符 宏標(biāo)識符 宏標(biāo)識 宏例

宏標(biāo)識 宏 LUDESERIAL NUM#defineNUM NUART CONSOLE#defineCONSOLE CONSOLEBAUD#defineCONSOLEBAUD 4、條件編譯偽指令格式#if(條件表達(dá)式…#elif(條件表達(dá)式…C語言的優(yōu)點(diǎn)是運(yùn)行速度快、編譯效率高、植性好和可讀性強(qiáng)。C語言支持模塊化程序設(shè)計(jì),支持自頂向下的結(jié)構(gòu)化程序設(shè)計(jì)方法。因此在嵌入式程序設(shè)計(jì)中經(jīng)常會用到C語言程序設(shè)計(jì)。嵌入式C語言程序設(shè)計(jì)是利用基本的C語言知識,面向嵌入式工程實(shí)際應(yīng)用進(jìn)行程序設(shè)計(jì)。也就是說它首先是C語言程序設(shè)計(jì),因此必須符合C語言基本語法,只是它是面向嵌入式的應(yīng)用而設(shè)計(jì)的程序。C語言的“預(yù)處理偽指令”在嵌入式程序設(shè)計(jì)中的應(yīng)用1、文件包含偽指格式 <頭文件名 ;標(biāo)準(zhǔn)頭文 “頭文件名 ;自定義頭文2、宏定義偽指格式# 宏標(biāo)識 宏nnnn 3、條件宏:先測試是否定義過某宏標(biāo)識符,然后決定如何處理。這樣做是為了避免重格 宏標(biāo) 宏標(biāo) 宏標(biāo)識 宏例

宏標(biāo)識 宏 LUDESERIAL NUM#defineNUM NUART CONSOLE#defineCONSOLE CONSOLEBAUD#defineCONSOLEBAUD 4、條件編譯偽指格#if(條件表達(dá)式…#elif(條件表達(dá)式#elif(條件表達(dá)式這樣,編譯時,編譯器僅對#if()…#endif之間滿足 件表達(dá)式的源文件部分進(jìn)行編譯。使用寄存器變量當(dāng)對 個變量頻繁被讀寫時,需要反復(fù)內(nèi)存,從而花費(fèi)大量的存取時間。為此,C語言提供了 種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要內(nèi)存,而直接從寄存器中讀寫,從而提高效率。寄存器變量的說明符是register。對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計(jì)數(shù)是應(yīng)用寄存器變量的最好候選者。例WORDAddition(BYTE{register for(i=1;i<=n;i++){}return}活用位操作(熟練掌握)使用C語言的位操作可以減少除法和取模的運(yùn)算。在計(jì)算機(jī)程序中數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用“位運(yùn)算”來完成所有的運(yùn)算和操作,因而,靈活的位操作可以有效地提高程序運(yùn)行的效率。例inti=879/j=562%inti=879>>j=562-(562>>5<<例intRa;//Ra[15:16]=11Ra&=~(3<<15);C語言位運(yùn)算除了可以提高運(yùn)算效率外,在嵌入式系統(tǒng)的編程中,它的另個最典型的應(yīng)用,而且十分廣泛地正在被使用著的是位間的(&)、(|)、非(~)操作,這跟嵌入式系統(tǒng)的編程特點(diǎn)有很大關(guān)系。例rGPCDAT=(rGPCDAT&0xFFFFFFF

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論