1. 指令集1.1 指令集指令集是一個CPU的基石,,要實現(xiàn)CPU 計算和控制功能,,就必須定義好一系列與硬件電路相匹配的指令系統(tǒng). 指令就是我們交代CPU 要執(zhí)行的操作,指令集就可以簡單理解為指令的集合,。我們把cpu 能夠識別的指令匯總在一起就構(gòu)成了一個指令集,。 不同的CPU 有不同的指令集,,根據(jù)他們的繁簡程度可以分為兩種:復(fù)雜指令集CISC 和精簡指令集 RISC 1.2 指令集架構(gòu)指令架構(gòu)(Instruction Set Architecture, 縮寫為ISA),,是軟件和硬件的接口,不同的應(yīng)用需求,,會有不同的指令架構(gòu),。要設(shè)計一款CPU 指令體系就是設(shè)計的出發(fā)點。 2. RISC-V 指令集架構(gòu)RISC-V 指令有以下特點:
要滿足現(xiàn)在操作系統(tǒng)和應(yīng)用程序的基本運行,,RV32G指令集或者RV64G指令集就夠了,。RV32G和RV64G指令集只有寄存器位寬和尋址大小不同。這些指令按照功能可以分為如下幾類:
從上表我們可以看到,,RISC-V 指令集具有模塊化特點,。這就允許我們根據(jù)自己的需求,選擇一個基礎(chǔ)指令集,,加上若干個擴展指令集靈活搭配,,就可以得到我們想要的指令集架構(gòu),進而根據(jù)這樣的指令架構(gòu),,設(shè)計出貼合我們需求的CPU. 作為初學(xué)者,,我們了解RISC-V 的核心即可。它的最核心部分是一個基礎(chǔ)指令集,,叫做RV32I. RV32I 包含的指令是固定不變的,,這為編譯器設(shè)計人員,操作系統(tǒng)開發(fā)人員和匯編語言程序員提供了穩(wěn)定的基礎(chǔ)框架,。 RV32I 指令集: RV32I 指令集如圖所示,,把帶下劃線的字母從左至右連接組合就是組成了RV32I指令,。{}表示集合中垂直方向的每個項目指令不同變體。變體用下劃線字母或者下劃線表示表示,,如果大括號里面只有下劃線,,則表示對此變體不需要用字母表示 我們結(jié)合具體例子來看:下圖表示了bge、blt,、bgeu,、bltu四個指令。 3. 指令格式下圖是RISC-V 指令格式,,從下圖可以看到RSIC-V共六種指令格式,。
六種指令格式作用如下:
4.寄存器在RISC-V 的規(guī)范里面定義了32 個通用寄存器。其中31個是常規(guī)寄存器,,1個恒為0值的x0寄存器,。 0值寄存器是為了滿足匯編語言程序員和編譯器編寫者的使用需要,他們可以使用x0寄存器作為操作數(shù),,來完成功能相同的操作,。 addi x0,x0,0 ; 0 = 0 + 0,相當于 nop 空指令 RSIC-V 寄存器說明
5. RV32I 指令解讀5.1 算術(shù)與邏輯指令在RV32I 中包括算術(shù)指令(add/sub)、數(shù)值比較指令(slt),、邏輯指令(and/or/xor)以及移位指令(sll/srl/sra)這幾種指令,。 這些指令和其他指令集差不多,它們從寄存器讀取兩個32位的值,,并將32位運算結(jié)果再寫回到目標寄存器,。 I型指令:立即數(shù)算術(shù)運算 R型指令:寄存器與寄存器操作指令 需要指出的是,在寄存器與寄存器操作的算術(shù)指令中,。必須要有減法指令。這和立即數(shù)操作指令不同,。 5.2 Load 和 Store 指令在RISC-V 指令集中,,對內(nèi)存的讀寫只能通過LOAD 和 STORE 指令實現(xiàn)。而其他的指令只能以寄存器為操作對象,。 如上圖所示,,load 和 store 的尋址模式只能是符號擴展12位的立即數(shù),加上基地址寄存器得到訪存的存儲器地址,。因為沒有了復(fù)雜的內(nèi)存尋址方式,,這讓CPU 流水線可以對數(shù)據(jù)沖突提前做出判斷,并通過流水線各級轉(zhuǎn)送加以處理,,而不需要加入空操作(NOP),,極大的提高了代碼的執(zhí)行效率。 5.3 分支跳轉(zhuǎn)指令5.3.1 有條件的分支跳轉(zhuǎn)RV32I 中的條件跳轉(zhuǎn)就是通過比較兩個寄存器的值,進行分支跳轉(zhuǎn):
5.3.2 無條件的分支跳轉(zhuǎn)無條件跳轉(zhuǎn)指令可以細分為直接跳轉(zhuǎn)和間接跳轉(zhuǎn),。直接跳轉(zhuǎn)指令JAL 如下圖所示:
間接跳轉(zhuǎn)直接JALR如下:
5.4 其他指令除了內(nèi)存地址空間和通用寄存器地址空間外,RISC-V 還定義了一個獨立的控制和狀態(tài)寄存器地址空間(Control Status Register) 每個處理器實現(xiàn)的CSR會因設(shè)計目標不同而有差異,,但是這些CSR的訪問方式卻是一樣的,,訪問這些CSR指令定義在了用戶指令集中(Zicsr指令集擴展) 有了上圖這些CSR 指令,能夠讓我們輕松的訪問一些程序性能計數(shù)器,。這些計數(shù)器包括系統(tǒng)時間,、時間周期以及執(zhí)行的指令數(shù)目。 |
|
來自: 新用戶0118F7lQ > 《微信文章》