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