儘管arm核在智慧型終端市場風光無限,但依賴於低功耗、超強的處理能力和較為便宜的license, mips核心系列晶元依然在電子產品和網路裝置中占有很大的市場份量,咱們國家的龍芯用的也是mips架構。mips的64位系統產品主要面向伺服器,32位主要用於消費類電子和網路裝置等方面。32位mips有兩種指令集模式,一種是mips32指令集,一種是mips16e指令集模式。後者指令編碼是16位元,號稱能夠使編譯後的**減少30%左右,主要用於控制器系列產品中節省記憶體。
一、暫存器使用約定
1. mips32暫存器
暫存器名稱和
使用約定如下圖:
暫存器29 (sp)——這是堆疊指標。它指向堆疊中的下乙個可用單元。從棧頂獲取乙個位元組是sp-1位址的內容。暫存器30 (fp)——這是幀指標。它指向當前函式的幀。在需要時,每個函式會建立乙個新幀,通過該幀分配自動變數和臨時變數。編譯器優化可能會取消通過幀指標進行的堆疊指標引用,而將它們轉換為通過堆疊指標進行的等效引用。這種優化使得幀指標可以用作通用暫存器。
2. mips16e暫存器
其與32位指令集模式對照如下圖:
mips16e模式下,$0是s0,$1是s1。即mips16e模式下主要用a0,a1,a2,a3,v0,v1,s0,s1,t8,sp,ra這11個暫存器。
move指令可以訪問32個暫存器,乘法指令可以用hi和lo,也有讀取hi和lo的指令。t8($24)一般是用於條件測試指令
3. 函式呼叫時的暫存器使用約定
1)暫存器a0-a3 用於向函式傳遞引數。呼叫函式時,不會保留這些暫存器的值。
2)暫存器t0-t7 和t8-t9 是由呼叫程式儲存的暫存器。呼叫函式必須將這些值壓入堆疊,以儲存暫存器的值。
3)暫存器s0-s7 是由被呼叫程式儲存的暫存器。被呼叫函式必須儲存這些暫存器中會被修改的暫存器的值。
4)如果優化器取消將暫存器s8/fp 用作幀指標,那麼該暫存器的值需要儲存。否則, s8/fp 是被保留的暫存器。
5)暫存器ra中包含函式呼叫的返回位址。
6)ra和sp在程式入口處在有必要時應該儲存。
二、引數傳遞
1. 引數從左到右存放在a0,a1,a2,a3暫存器中,返回值存放在v0和v1暫存器中。
2. 每個引數不論是字還是位元組都用乙個暫存器來傳,自動進行0擴充套件或者有符號擴充套件。如果是資料結構傳遞需要模擬記憶體的存放,而不是乙個位元組也用乙個暫存器來放。傳遞資料結構需要進行彙編的除錯以保證正確。gl5110不允許傳遞資料結構,應該傳遞資料結構的指標。gl5110不允許使用浮點數。
3. 當引數個數超過4個時,用棧空間進行傳遞。事實上,a0,a1,a2,a3表示的引數在棧中也有對應的16位元組空間。(是不是有點太浪費棧了...)
4. 返回32位數在v0,64位時為v0和v1。
三、棧幀結構
熟悉棧幀結構將極大地幫助彙編除錯和c/彙編混合程式設計。其棧幀結構如下圖:
1. 交界處的(>=16位元組)引數空間是未定義的,其在被呼叫函式的入口處,這4個引數是和a0,a1,a2,a3暫存器是相對應的。但棧裡面的引數空間的值卻是未定義的,即裡面的值與a0,a1,a2,a3的值並不相等。
2. 超過4個引數時會把其他的引數內容放到outgoing args域。
3. 被呼叫函式的棧幀結構並不包括呼叫函式的引數空間,其一般包括3個域:區域性變數域(非強制)、暫存器儲存域(非強制)和引數空間(非葉子函式是強制的,葉子函式非強制)。引數空間至少16位元組,加上一般ra也是要儲存的,而sp預留的空間必須是8的倍數,故乙個棧幀結構至少耗掉24位元組。棧浪費空間比較嚴重,所以建議模組開發人員在程式設計時有意識減少呼叫層次,扁平化呼叫也許更適合一些。
4. 一般在函式的入口,編譯器就會給這個函式預留好棧幀的空間,所以可以理解成編譯器是明確該函式體的行為之後才進行空間預留的。
C和彙編混合程式設計
c和彙編混合程式設計 嵌入式裡面用到彙編的地方 開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。c中內嵌彙編大多數為arm和thumb指令,其中注意 1 不能直接向pc賦值,程式跳轉用b或者bl指令 2 使用物理暫存器不能使...
C 彙編的混合程式設計
aptcs arm thumb 程式呼叫規範 pcs規定了應用程式的函式可以如何分開地寫,分開地編譯,最後將它們連線在一起,所以它實際上定義了一套有關過程 函式 呼叫者與被呼叫者之間的協議。協議規定 呼叫函式如何傳遞引數 即壓棧方法,以何種方式存放引數 被呼叫函式 如何獲取引數,以何種方式傳遞函式返...
C語言與彙編混合程式設計
c語言是乙個系統級的語言,是乙個可以直接深入到硬體最底層操作的語言。在前邊的部分部落格中,我們提到過,對硬體的操作實際上是對硬體控制器中的暫存器或儲存單元進行操作,而在arm架構中,這些暫存器或儲存單元一般是以記憶體對映的方式進行訪問的。在c語言中,指標剛好提供了訪問任意的記憶體位址的方式,因此從語...