2009年6月15日,MIPS公司網(wǎng)站發(fā)布新聞,中國科學院計算所取得MIPS32和MIPS64 Architecture的授權,用于龍芯的開發(fā)和商用。在處理器領域,Architecture指處理器的指令集體系結構,Microarchitecture指處理器的微架構,也就是內(nèi)部實現(xiàn)的結構。這則新聞翻譯一下就是:龍芯采用了MIPS的指令集。
處理器是電子、信息領域最關鍵、最底層的技術,一直被國外把持著,龍芯作為我國自主研發(fā)的處理器,牽動著各方面的神經(jīng),我們都希望自己的處理器能完全自我創(chuàng)新,不被外界控制,然而,龍芯還是不得不使用了現(xiàn)存的指令集,這歸根到底,還是指令集的威力太強大,它的強大在于它背后是一個生態(tài)鏈,而不是一家公司。
指令集就像語言(漢語、英語等)一樣,定義一套語言其實并不難,難的是你要讓別人去接受你定義的語言。如果重新使用一套指令集,與之配套的編譯器、操作系統(tǒng)、各種應用軟件也都要重新編寫,這樣的工作量和難度,是無法想象的,因此使用現(xiàn)存的指令集及軟件,也是無奈的選擇。3.1 指令集是什么
3.1.1 從處理器編程模型談起——一切從模型開始
處理器的主要任務就是計算,如C = A + B,人們一看就知道這句話是什么意思,但是處理器只能認識0和1,不認識這句話,而且處理器更不知道C = A + B和C = B + A是一個意思。因此,我們要定義一套規(guī)則讓計算機能夠理解人類的意圖。
我們將A、B、C稱為操作數(shù),“+”稱為操作碼。處理器中做運算的單元稱為ALU(算術邏輯單元),操作碼代表了ALU中的一個運算。操作數(shù)存儲在存儲器(Memory)中,由于從存儲器中訪問數(shù)據(jù)很慢,因此在離ALU很近的地方放置了一些寄存器(Registers),這樣中間計算結果就可以存儲在寄存器中,不用每次都經(jīng)過存儲器。
一個基本的C = A + B操作,可以分解為下面這些小的步驟來完成:
load R3, #0; 從內(nèi)存地址0處取A這個值,放在R3中
load R2, #1; 從內(nèi)存地址1處取B這個值,放在R2中
add R0, R3, R2; 把R3和R2相加,結果存放到R0中
store R0, #2; 把R0中的值存放在內(nèi)存地址2中
每行語句就是一條指令,load、add、store為操作碼,后面跟著的是操作數(shù),“;”后面為注釋,這種指令的寫法就是匯編語言的格式。處理器公司對外發(fā)布的指令集手冊,就使用匯編語言來進行描述。
由于計算機只能認識0和1這兩個數(shù)字,不認識load、add這些字,因此,這些字要被編碼為計算機能認識的格式。
我們對操作碼進行編碼,假設處理器只有4條指令,那么每條指令用2 bit即可 表示:
同樣的方法,可以對寄存器和內(nèi)存進行編碼。
這時候,我們就可以定義add這條指令在計算機中的格式:
這種經(jīng)過編碼后的指令稱之為機器語言。
處理器在讀到指令01001110時,根據(jù)指令的格式進行解碼,解出操作碼和操作數(shù),然后執(zhí)行。