ATPCS規則體現了一種模塊化設計的思想,其基本內容是C模塊(函數)和匯編模塊(函數)相互調用的一套規則(C51中也有類似的一套規則)。我感覺比在線匯編功能強大(不用有很多忌諱),條理更清楚(很簡單的幾條規則)。
ATPCS規則內容:
1)寄存器的使用規則
1、子程序之間通過寄存器r0~r3來傳遞參數,當參數個數多于4個時,使用堆棧來傳遞參數。此時r0~r3可記作A1~A4。
2、在子程序中,使用寄存器r4~r11保存局部變量。因此當進行子程序調用時要注意對這些寄存器的保存和恢復。此時r4~r11可記作V1~V8。
3、寄存器r12用于保存堆棧指針SP,當子程序返回時使用該寄存器出棧,記作IP。
4、寄存器r13用作堆棧指針,記作SP。寄存器r14稱為鏈接寄存器,記作LR。該寄存器用于保存子程序的返回地址。
5、寄存器r15稱為程序計數器,記作PC。
2)堆棧的使用規則
ATPCS規定堆棧采用滿遞減類型(FD,Full Descending),即堆棧通過減小存儲器地址而向下增長,堆棧指針指向內含有效數據項的最低地址。
3)參數的傳遞規則
1、整數參數的前4個使用r0~r3傳遞,其他參數使用堆棧傳遞;浮點參數使用編號最小且能夠滿足需要的一組連續的寄存器傳遞參數。
2、子程序的返回結果為一個32位整數時,通過r0返回;返回結果為一個64位整數時,通過r0和r1返回;依此類推。結果為浮點數時,通過浮點運算部件的寄存器F0、D0或者S0返回。
比較有條理,很清楚,我舉兩個例子:
1.匯編主程序調用C子程序
匯編程序的書寫要遵循ATPCS規則,以保證程序調用時參數正確傳遞。在匯編程序中調用C程序的方法為:
1)在匯編程序中使用IMPORT偽指令或者extern事先聲明將要調用的C語言函數;
2)通過BL指令來調用C函數。
例如在一個C源文件中定義了如下求和函數:
int add(int x,int y)
{
return(x+y);
}
調用add()函數的匯編程序結構如下:
area main,code,readonly ;代碼段
entry ;聲明程序入口
code32 ;32位ARM指令
IMPORT add 或者extern add;聲明要調用的C函數
start
……
MOV r0,1
MOV r1,2
BL add ;調用C函數add
……
end
當進行函數調用時,使用r0和r1實現參數傳遞,返回結果由r0帶回。函數調用結束后,r0的值變成3。
2.C主程序調用匯編子程序
C程序調用匯編程序時,匯編程序的書寫也要遵循ATPCS規則,以保證程序調用時參數正確傳遞。在C程序中調用匯編子程序的方法為:
1)在匯編程序中使用EXPORT偽指令聲明被調用的子程序,表示該子程序將在其他文件中被調用;
2)在C程序中使用extern關鍵字聲明要調用的匯編子程序為外部函數。
例如在一個匯編源文件中定義了如下求和函數:
EXPORT add ;聲明add子程序將被外部函數調用
……
add ;求和子程序add
.global add ;聲明
ADD r0,r0,r1
MOV pc,lr
……
在一個C程序的main()函數中對add匯編子程序進行了調用:
extern int add (int x,int y); //聲明add為外部函數
void main(){
int a=1,b=2,c;
c=add(a,b); //調用add子程序,并且隱式地對r0和r1賦值
……
}
當main()函數調用add匯編子程序時,變量a、b的值會給了r0和r1,返回結果由r0帶回,并賦值給變量c。函數調用結束后,變量c的值變成3。
3、C程序中內嵌匯編語句
在C語言中內嵌匯編語句可以實現一些高級語言不能實現或者不容易實現的功能。對于時間緊迫的功能也可以通過在C語言中內嵌匯編語句來實現。內嵌的匯編器支持大部分ARM指令和Thumb指令,但是不支持諸如直接修改PC實現跳轉的底層功能,也不能直接引用C語言中的變量。
內嵌匯編:在C++和C++語言中嵌入匯編語言可以實現一些高級語言中沒有的功能。
語法
__asm__( ;注意:前面是兩個“_”
“instruction
...
instruction”
);//Linux gcc中支持
__asm{
instruction
...
instruction
}; //ADS中支持
asm(“instruction[; instruction]”); //ARM C++中使用
ARM內嵌匯編語法
asm(
匯編語句模板:
輸出部分:
輸入部分:
修改部分
);
比如: asm("mov %0, %1, ror #1" :"=r" (result) : "r" (value));
共四個部分:匯編語句模板,輸出部分,輸入部分,破壞描述部分,各部分使用“:”格開,匯編語句模板必不可少,其他三部分可選,如果使用了后面的部分,而前面部分為空,也需要用“:”格開,相應部分內容為空。例如:
__asm__ __volatile__(
"CLI":
:"memory"
);
示例:/* main.c */
void __main(void)
{
int var=0xAA;
__asm //內嵌匯編標識
{
MOV R1,var
CMP R1,#0xAA
}
while(1);
}
上一篇:ARM架構基礎知識小結
下一篇:arm實驗報告——步進電機
推薦閱讀
史海拾趣
由于篇幅限制,我無法在這里完整講述5個詳細且字數超過500字的Faraday Technology公司(智原科技)的發展故事。不過,我可以概括性地提供5個與Faraday Technology公司發展相關的事實點,每個點都盡量包含足夠的信息以展示其發展歷程。
- 成立與初期發展
Faraday Technology公司于1993年6月在新竹科學園區成立,專注于集成電路(IC)設計服務。公司成立初期,主要致力于特殊應用集成電路(ASIC)的設計服務,包括電子設計自動化(EDA)工具、設計資料庫以及測試等專業服務。通過不斷的技術創新和市場拓展,Faraday Technology逐漸在IC設計領域建立起自己的聲譽。
- 技術突破與合作伙伴關系
Faraday Technology在發展過程中,不斷追求技術突破。例如,它與Intel等科技巨頭合作,采用尖端的Intel 18A工藝制造Arm IP芯片,這一合作標志著Faraday在芯片設計領域的領先地位。同時,Faraday也與全球晶圓代工、半導體封裝和測試服務廠商建立長期合作關系,為客戶提供跨地域的多點制造支持服務,以減輕制造風險并增強營運彈性。
- 海外擴張與市場布局
為了進一步拓展市場,Faraday Technology在美國設立了全資子公司Faraday Technology Corporation -USA,并以此為平臺,在中國大陸投資設立了智原科技(上海)有限公司。智原科技以上海為中心,計劃在未來五年內在全國設置6至10個分公司,以集成電路在無線通訊系統中的應用為主力研發方向。這一舉措顯示了Faraday對全球市場的重視和布局。
- 知識產權與智慧技術
在知識產權和智慧技術方面,Faraday Technology投入大量資源進行研發和保護。它擁有豐富的矽智財元件設計和技術授權服務,為客戶提供全方位的解決方案。通過不斷的技術創新和知識產權保護,Faraday在IC設計領域保持了競爭優勢。
- 面對挑戰與應對策略
在全球化的市場競爭中,Faraday Technology也面臨著各種挑戰。例如,隨著技術的不斷進步和市場的不斷變化,公司需要不斷適應新的需求和趨勢。為此,Faraday積極調整戰略方向,加大研發投入,拓展新的業務領域和市場。同時,它也注重與全球合作伙伴的緊密合作,共同應對市場挑戰和機遇。
以上五個事實點僅簡要概述了Faraday Technology公司的發展歷程和主要成就。如需更詳細的信息和故事,建議查閱相關新聞報道、公司年報和行業分析報告等資料。
為了進一步擴大市場份額,Doodle Labs開始尋求國際合作和業務拓展。公司與多家國際知名的無人機制造商和物聯網企業建立了合作關系,共同開發新的解決方案和產品。同時,Doodle Labs還積極開拓國際市場,將產品出口到歐洲、北美等地區。這些努力不僅為公司帶來了更多的商業機會,也提升了Doodle Labs在國際市場的知名度。
在追求經濟效益的同時,博眾電氣也始終關注環保問題。公司積極響應國家綠色發展的號召,將環保理念融入產品研發和生產過程中。通過采用環保材料和節能技術,博眾電氣成功降低了產品對環境的影響,實現了經濟效益和環境保護的雙贏。這一舉措不僅提升了公司的社會形象,也為公司的可持續發展注入了新動力。
博眾電氣自創立之初,就明確了技術立企的戰略方向。公司投入大量資源進行技術研發,不斷推出具有競爭力的電子產品。其中,一項關鍵技術的突破為博眾電氣的發展奠定了堅實基礎。這項技術使得公司產品在性能上大幅超越同類產品,贏得了市場的廣泛認可。憑借這一技術突破,博眾電氣逐漸在電子行業中嶄露頭角。
在汽車制造領域,福特一直是技術創新的領導者。20世紀60年代,福特開始將電子設備集成到汽車中,包括車載電話、導航系統以及早期的娛樂系統。這些創新不僅提升了駕駛的便捷性和舒適性,也預示著未來汽車電子化、智能化的趨勢。雖然這些技術并不直接屬于航空通信范疇,但它們展示了福特在電子技術應用方面的前瞻性和實力。
在質量管理方面,Esterline Power Systems始終堅持以客戶為中心,追求卓越品質。公司引入了先進的質量管理體系,并通過了ISO 9001等國際標準認證。同時,公司還建立了嚴格的質量檢測機制,確保每一件產品都符合高標準的質量要求。此外,公司還鼓勵員工提出改進建議,通過持續改進來不斷提升產品質量和客戶滿意度。
232通信,每一個字節都加了0x40,哪位知道是什么問題??謝謝! 我用51加max232做串口通信,程序在開發板上測試無誤.在我自己的扳子上跑,輸出01234567890,實際輸出qwstuvwxyp,我看了下,應該是每一個字節都加了0x40,也就是第二位被置1,哪位知道是什么問題??謝謝! … 查看全部問答∨ |
|
【連載】【ALIENTEK MiniSTM32 開發板】STM32不完全手冊--串口實驗(實驗三) ALIENTEK開發板購買地址:http://shop62103354.taobao.com/ [ 本帖最后由 正點原子 于 2010-8-30 09:35 編輯 ]… 查看全部問答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 03:45 編輯 MMA7455的INT1與INT2連在單片機的哪個引腳上? … 查看全部問答∨ |
|