3.5 MIPS體系結構
計算機組成
3 指令系統體系結構
3.5 MIPS體系結構
MIPS是精簡指令系統的代表,采用了與X86相反的設計理念,並引領了精簡指令系統的潮流,那就讓我們一起來看一看這究竟是怎麽一回事。
要探討MIPS指令系統,就得從它的設計者John Hennessy開始說起。Hennessy 1977年進入斯坦福大學,81年領導了RISC微處理器研究小組,他也被稱為RISC的先驅。RISC是精簡指令系統計算機的簡稱。與之相對,之前的計算機上的指令系統就被稱為復雜指令系統,X86就是其中的代表。後來,Hennessy 共同創立了MIPS計算機系統公司。90年代,他主要是在斯坦福計算機系擔任系主任等職務,2000年起開始擔任斯坦福大學的校長。由於他所設計的MIPS體系結構引領了精簡指令系統的潮流,後來還獲得了IEEE的榮譽獎章,而他所創立的MIPS公司也一度創造了輝煌。
在80年代末上市,後來被收購,然後再一次上市,再一次被收購。現在MIPS處理器已經不再應用在計算機產品中了,但是在廣義的計算設備包括數字電視,遊戲機,網絡設備等領域仍然有廣泛的應用,其實MIPS公司商業上的興衰也是諸多 RISC微處理器公司的命運寫照。
第一代的MIPS是32位的, 在1985年推出了對應的處理器,R2000;
90年,R3000處理器對應著第二代的MIPS;
92年,MIPS擴展到了64位;94年,64位的MIPS又進一步升級;
96年的MIPS5並沒有對應的處理器;
然後在99年,MIPS指令系統進行了較大的調整,形成了MIPS32;
到了99年,以MIPS5為基礎,推出了MIPS64指令系統。
MIPS的設計指導思想非常的簡單,從它的名字就可以看出來。MIPS全稱的含義是一個流水線不會互鎖的微處理器。流水線是現代微處理器為提高性能而采用的一項技術,而流水線中的互鎖則是導致流水線性能降低的一個非常重要的因素。從這個名稱也可以看出,MIPS的指導思想是希望其指令的設計能讓微處理器運行的更快,性能更好。所以它主要的關註點是減少指令的類型,並且降低指令的復雜度,所以在MIPS指令系統當中,指令的總數是很少的。而且每條指令都比較簡單。它的主要目的就是希望可以用一個非常簡單的CPU來支持這樣的指令系統。而CPU越簡單就可以運行的更快。假設要編寫程序完成同樣的任務,用MIPS指令編寫,其指令數量是X-86指令的5倍,但是如果MIPS的CPU能夠做到比X86 CPU快10倍,那它仍然獲得了明顯的性能優勢。這就是MIPS,同時也是RISC的設計思想。
那MIPS的指令是怎麽體現它這樣的設計思想的呢?
第一,MIPS固定了指令的長度,都是32個比特,也就說MIPS中的一個WORD。我們要註意這和X86中一個WORD是16位是不同的。固定的指令長度,大大簡化了CPU從存儲器中取指令的工作。不用像X86 CPU那樣需要判斷每條指令的長度。
第二,MIPS采用了非常簡單的尋址模式。相比於X86提供的復雜多樣的尋址模式, 雖然給編程帶來了不便,但是大大簡化了CPU訪問存儲器的控制邏輯。
第三,MIPS指令的數量比較少,每條指令的工作也很簡單。基本上一條指令只完成一個操作,不像X86的指令,一條指令往往完成豐富的功能,這樣可以簡化指令的執行過程。不但簡化了CPU的控制邏輯,而且可以方便的實現各種讓指令並行執行的技術,從而提高CPU的性能。
第四,在MIPS指令系統中只允許LOAD和STORE這兩種指令訪問存儲器,而不支持X86指令中這些讓算術指令訪問存儲器的操作,因為訪存是一個相對復雜的工作。
這種限制就可以讓運算指令的實現變得非常的簡單。但是我們要註意,MIPS的這些特點讓直接使用MIPS指令進行編程變得非常的困難,因此,想要有高效率的MIPS程序,必須要有優秀的編譯器的支持。我們來看幾個MIPS指令的例子。
例如加法指令,它的格式是ADD a, b, c
我們註意,與X86指令不同,MIPS的加法指令是三個操作數 a, b, c ,這三個操作數可以是三個寄存器。除了加法運算,這裏還列出了減法,乘法,除法等等。還有邏輯運算,還有左移和右移這樣的移位運算。這裏我們可以看出MIPS的運算指令格式都非常簡潔和統一,而且這些指令的操作數都不可以是存儲器操作數。要訪問存儲器,就必須使用專門的訪存指令。
我們來看一個例子,假設A是一個100個字的數組,它的首地址存放在19號寄存器中,MIPS的寄存器編號用$符進行標記。
那如果我們想完成 A[10] = h + A[3] 這樣的運算,也就說將一個變量h加上數組A中的第三個元素,並賦給數組A的第十個元素。我們註意,變量h放在18號寄存器中,而我們可以使用8號寄存器用來存放臨時數據。那麽對應的MIPS指令需要如下幾條:
首先要用LOAD指令,將19號寄存器對應的地址加上偏移量12,因為MIPS當中一個字是32位,所以第三個元素與首地址之間的偏移是12。將19號寄存器對應的地址加上偏移量12計算得到的存儲器地址中的這個字裝入到8號寄存器中,這就相當於將數組A中的第三個元素賦給了一個臨時變量。
第二句是一個加法指令,將8號寄存器與18號寄存器相加, 並將結果存放在8號寄存器。這就相當於將數組A的第三個元素與變量h相加,還存在這個臨時變量中。
第三條指令是將8號寄存器中的數,也就是運算的結果存到以19號寄存器為首地址,偏移量為40的內存單元,這就是數組A的第十個元素的位置。
那我們用這三條MIPS指令就完成了這個功能。
而這張表列出了MIPS的所有的通用寄存器,總共有32個,每個都是32位。相比於X86的寄存器,MIPS的通用寄存器是非常規整的。這32個寄存器的編號從0一直到31,那我們可以用$符加上編號進行指示。同時每個寄存器還有一個符號的名稱,並且約定了一些特定的用途,例如8號到15號寄存器,又被稱為t0到t7的寄存器,用來保存臨時的變量。而1號寄存器,它的名稱是 at,專門留給匯編器使用。
在編寫匯編程序時,我們可以用數字,也可以用名稱,來表示這些寄存器。例如 lw 這兩條指令所表達的含義以及對應的二進制編碼都是一樣的。add 這兩條指令也是如此。如果我們直接用MIPS指令進行匯編語言的編程,從t0到t7,s0到s7,這些寄存器都是我們經常使用的。MIPS 的體系結構簡明扼要,需要說明的就是這些。
我們已經了解了MIPS的設計理念,那這樣的理念究竟是如何實現的呢?在下一節我們將一起來探究MIPS的指令。
3.5 MIPS體系結構