MIPS指令集相關
MIPS指令系統有:MIPS I;MIPS II;MIPS III 和MIPS IV。當然,指令系統是向後相容的。例如,基於MIPS II的程式碼可以在MIP III和MIPS IV的處理器上,可以完美執行。
關於MIPS指令集,有幾點需要特別專注:
*MIPS指令是32位長,即使在64位的CPU上。這對於區域性跳轉指令的理解很有幫助。
比如:J (TARGET);JAL (TARGET)。J和JAL的OPERCODE是6位,剩下的26為存放跳轉偏移量。由於任何一個指令都是32位(或4位元組)對齊(ALIGN)的,所以J 和JAL最大的伸縮空間是2^28=256M。如果你的程式要作超過256M的跳轉,你就必須用
*MIPS CPU的SR(STATUS REGISTER)中有幾位是很重要的設定,當我們選擇指令系統或要用64位的MIPS的CPU CORE在32模式下(絕大多數情況,弟兄們 別告訴我你在寫64位的程式:--) )。
SR[XX]:
1:MIPS IV INSTRUCTION SET USABLE
0:MIPS IV INSTRUCTION SET UNUSABLE
SR[KX]
SR[SX]
SR[UX]:
0:CPU工作在32位模式下
1:CPU工作在64位模式下
一般而言,如果你要從頭寫一個
*在以後我們會單獨的一章講將流水線和指令系統,特別是跳轉指令的關係。在這裡,我們只簡單提一下。對任何一個跳傳指令後面,FOR SIMPLITY,要加上一個空轉指令(NOP)。從而使得CPU的PIPELINE不會錯誤的執行一個預取(PRE_FETCH)得指令。當然這個NOP可以替換為別的。以後再講。放一個NOP是最簡單和安全的。有興趣的讀者可以用mips64-elf-objdump -d 來反彙編一個
OBJECT檔案。你就會一目瞭然了。
*一定要記住:MIPS I,II, III和IV指令系統不包含PRIVILEGED INSTRUCTIONS。
換句話說,都是那些在USER MODE下可以用的指令(當然KERNEL下也能用)。對於CPO的操作不屬於指令系統。
*有一點在MIPS CPU下,要千萬注意:ALIGN。MIPS對ALIGN的要求是嚴厲的。這一點與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。