arm函數調用約定

要想理解彙編代碼,首先重要的事情就是理解代碼之間的交互——意思是一個函數調用另一個函數的方式。這包括了參數如何傳遞以及如何從函數返回結果——稱之爲調用的約定。編譯器必須嚴格的遵守相關標準進行代碼編譯,這樣生成的代碼,才能夠相互兼容。
上面討論過,寄存器是的存儲空間非常少,並且靠近CPU——用來存儲當前使用的一些值。ARM CPU有16個寄存器:r0到r15。每個寄存器爲32bit。調用約定規定了這些寄存器的特定用途。如下:
r0 – r3:存儲傳遞給函數的參數值,多餘的參數通過壓棧傳遞!
r4 – r11:存儲函數的局部變量,Thumb模式不會使用r8以後的寄存器
r12:是內部過程調用暫時寄存器(intra-procedure-call scratch register)。
r13:存儲棧指針(sp)。在計算機中,棧非常重要。這個寄存器保存着棧頂的指針。這裏可以看到更多關於棧的信息。
r14:鏈接寄存器(link register)。存儲着當被調用函數返回時,將要執行的下一條指令的地址。

r15:用作程序計數器(program counter)。存儲着當前執行指令的地址。每條執行被執行後,該計數器會進行自增(+1)。

函數的返回值放到r0中。
當我們查看剛進入函數的時候:
pc總是包含下一個要被執行的指令的位置。
arm7採用三級流水
(1)取指(fetch)
取指級的任務是從程序存儲器中讀取指令。
(2)譯碼(decode)
譯碼級完成對指令的分析,併爲下一個週期準備數據路徑需要的控制信號。在這一級,指令佔用譯碼邏輯,不佔用數據通路。
(3)執行(excute)
完成指令要求的操作,並根據需要將結果寫回寄存器。指令佔用數據路徑,寄存器堆被讀取,操作數在桶行移位器中被移位。運算器產生運算結果並回寫到目的寄存器中,運算器根據指令需求和運輸結果更改狀態寄存器的條件位
arm7中執行和取指是隔了一級譯碼級,那一級不讀取數據,當前PC=原PC+2 * sizeof(inst_size)
lr (總是)包含函數返回時要裝載的地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章