1. 程式人生 > >MIPS指令集相關

MIPS指令集相關

MIPS指令系統有:MIPS IMIPS IIMIPS III MIPS IV。當然,指令系統是向後相容的。例如,基於MIPS II的程式碼可以在MIP IIIMIPS IV的處理器上,可以完美執行。

關於MIPS指令集,有幾點需要特別專注:

*MIPS指令是32位長,即使在64位的CPU上。這對於區域性跳轉指令的理解很有幫助。

比如:J (TARGET)JAL (TARGET)JJALOPERCODE6位,剩下的26為存放跳轉偏移量。由於任何一個指令都是32(4位元組)對齊(ALIGN)的,所以J JAL最大的伸縮空間是2^28=256M。如果你的程式要作超過256M的跳轉,你就必須用

JALRJR,通過一個GPR暫存器來存放你的跳轉地址。由於一個暫存器是3264位的,你就沒有任何限制了。



*MIPS CPUSR(STATUS REGISTER)中有幾位是很重要的設定,當我們選擇指令系統或要用64位的MIPSCPU CORE32模式下(絕大多數情況,弟兄們 別告訴我你在寫64位的程式:--) )

SR[XX]
1MIPS IV INSTRUCTION SET USABLE
0MIPS IV INSTRUCTION SET UNUSABLE

SR[KX]
SR[SX]
SR[UX]
0CPU工作在32位模式下
1CPU工作在64位模式下

一般而言,如果你要從頭寫一個

MIPS核心為32位程式,最好把上述值設為0。為什麼最好呢?因為我在工作中沒有去冒風險,設她們為1who knows what would happen?:-) And then why bother:--)?

*在以後我們會單獨的一章講將流水線和指令系統,特別是跳轉指令的關係。在這裡,我們只簡單提一下。對任何一個跳傳指令後面,FOR SIMPLITY,要加上一個空轉指令(NOP)。從而使得CPUPIPELINE不會錯誤的執行一個預取(PRE_FETCH)得指令。當然這個NOP可以替換為別的。以後再講。放一個NOP是最簡單和安全的。有興趣的讀者可以用mips64-elf-objdump -d 來反彙編一個

OBJECT檔案。你就會一目瞭然了。

*一定要記住:MIPS IIIIIIIV指令系統不包含PRIVILEGED INSTRUCTIONS

換句話說,都是那些在USER MODE下可以用的指令(當然KERNEL下也能用)。對於CPO的操作不屬於指令系統。


*有一點在MIPS CPU下,要千萬注意:ALIGNMIPSALIGN的要求是嚴厲的。這一點與POWERPC是天壤之別。指令必須是32位對齊。資料型別必須在它們的大小邊界對齊。簡單的比如:When CPU running under 32bit mode, int must 32bit aligned; long 32bit aligned; pointer must be 32bit aligned; char must 8 bit aligned. long long must 64 bit aligned