㈠ arm 如何調用子程序,就是用c語言寫的,好像有許多格式控制,不是很明白,請指教
用C語言寫的ARM程序調用C函數和普通的C語言格式一樣,沒有特殊的地方;
如果用C語言調用ARM的匯編,則有規則。
在C程序和ARM匯編程序之間相互調用時必須遵守ATPCS(ARM-THUMB procere call standard )規則。ATPCS規定了一些子程序間調用的基本規則,比如:
寄存器的使用規則
子程序之間通過寄存器r0~r3來傳遞參數,當參數個數多於4個時,使用堆棧來傳遞參數。
在子程序中,使用寄存器r4~r11保存局部變數。
寄存器r12用於保存堆棧指針SP,當子程序返回時使用該寄存器出棧,記作IP。寄存器r13用作堆棧指針,記作SP。寄存器r14稱為鏈接寄存器,記作LR。該寄存器用於保存子程序的返回地址。寄存器r15稱為程序計數器,記作PC。
堆棧的使用規則
堆棧採用滿遞減類型(FD,Full Descending),即堆棧通過減小存儲器地址而向下增長,堆棧指針指向內含有效數據項的最低地址。
參數的傳遞規則
整數參數的前4個使用r0~r3傳遞,其他參數使用堆棧傳遞;
子程序的返回結果為一個32位整數時,通過r0返回;返回結果為一個64位整數時,通過r0和r1返回;依此類推。
匯編程序調用C程序的方法為:首先在匯編程序中使用IMPORT偽指令事先聲明將要調用的C語言函數;然後通過BL指令來調用C函數。
C程序調用匯編子程序的方法為:首先在匯編程序中使用EXPORT偽指令聲明被調用的子程序,表示該子程序將在其他文件中被調用;然後在C程序中使用extern關鍵字聲明要調用的匯編子程序為外部函數。
㈡ arm調用子程序與51調用子程序有什麼區別
51:只有ACALL、LCALL兩條子程序調用指令,其中ACALL只能在2^11范圍內調用子程序,而LCALL可以調用任意位置的子程序。特點:使用指令時無任何後綴、修飾,硬體會自動保存斷點,在被調用的子程序最後用一條RET指令便輕松返回斷點;
ARM:只有BL(X)指令全范圍調用子程序,BL指令是用B(跳轉)指令擴展來的,表示在B到一個地址時,同時保存下條指令的地址到LR中,因此,在你的子程序中需要使用B/BX
LR指令來返回斷點,或者使用MOV
PC,LR來返回。指令的後綴X,表示在調用或返回時是否需要切換處理器狀態。
綜合來說,調用子程序是沒有本質區別的,不過51因為用途簡單,硬體幫你做了更多的事情,比如一個RET就返回了,而ARM就復雜,靈活一些,傻瓜機和單反的區別。希望能幫到你