簡介
RISC-V64位/32位提供了32個整型通用寄存器,編號是x0~x31,這些整型通用寄存器的寬度與架構位數一致。
浮點數寄存器與整形寄存器一樣也提供了32個:f0~f31,位數與架構位數一致。
通用寄存器介紹
零寄存器
x0/zero
x0寄存器又被稱為zero寄存器,它的讀寫是無效的,它的值只能為0,這是為了讓編譯器進行優化
比如當進行一些運算時:
add x1, x2 , x3
上面這段匯編的作用是進行相加運算,將x2和x3寄存器的值相加的結果并放入x1寄存器,但是如果x3寄存器的值為0
處理器仍然需要去讀取一次x3寄存器的值,所以編譯器可以進行這樣的優化:
add x1, x2, x0
當RISC-V處理器執行這條指令的時不會去讀取x0寄存器的值,會直接按0來運算,這樣就可以省去與0做運算時讀取的步驟。
RISC-V處理器在設計時只要涉及到x0寄存器的讀取一律按0來處理不會去讀取x0的寄存器,這么做的目的是為了方便編譯器優化某些運算。
返回地址寄存器
x1/ra
x1寄存器也稱為RA寄存器,意為Return Address。當一個函數被調用時,RA寄存器會被自動保存下來,以便在函數執行完畢后能夠返回調用該函數的位置。因此,在函數執行過程中,RA寄存器也可以被用來存儲函數的返回地址。它也時常被用來函數傳參。
棧指針寄存器
x2/sp
通常用于存儲棧指針(stack pointer)。在RISC-V中,棧是一種先進后出(Last-In-First-Out)的數據結構,常用于函數調用時的變量保存和程序現場保護等操作。
全局寄存器
x3/gp
x3寄存器是RISC-V架構中的通用寄存器之一,通常用于存儲全局指針(global pointer)。在RISC-V中,全局指針是一個特殊的指針,指向全局變量和靜態數據區(static data region)的起始地址。
全局變量是在程序啟動時就已經被分配好的變量,它們通常存儲在靜態數據區中,其內存地址在編譯時就已經確定。全局指針GP通常指向靜態數據區的起始地址,用于訪問和管理全局變量。
線程寄存器
x4/tp
x4寄存器是RISC-V架構中的通用寄存器之一,通常用于存儲線程指針(thread pointer),也稱為線程局部存儲器指針(thread-local storage pointer)。
在線程級別的編程中,線程指針是一個非常重要的概念。它是一個指針,指向當前線程的局部存儲器(thread-local storage),也就是線程私有的數據區域。在多線程編程中,每個線程都有自己獨立的線程指針,并且可以在其對應的局部存儲器中存儲和管理線程私有的數據。
臨時寄存器
x5/t0、x6/t1、x7/t2、x28/t3、x29/t4、x30/t5、x31/t6
這些寄存器是一個臨時寄存器,通常用于臨時存儲計算中的中間結果或臨時變量。
函數調用寄存器
x8/ra
x8是一個通用寄存器,主要用于存儲數據和地址。
x8通常被稱為ra寄存器,它有一個特殊的作用,即用于存儲函數返回地址,因此也被稱為返回寄存器。在函數調用時,調用者將函數返回地址壓入棧中,然后調用函數時將返回地址存儲在ra寄存器中,函數執行完畢后再從ra寄存器中取出返回地址并跳轉回調用者。X8寄存器還可以被用作普通的通用寄存器,存儲數據和地址。
x9/s1
x9寄存器是RISC-V CPU的一個通用寄存器,通常被稱為s1(scratch register 1)。
由于RISC-V代碼遵循RISC(Reduced Instruction Set Computing,精簡指令集計算機)原則,所以寄存器數量比較有限,因此x9寄存器通常被用作一個通用寄存器,多種指令都會使用到它,比如函數調用時用于保存函數調用者的棧指針,或者作為全局指針等。除此之外,x9寄存器也可以用于實現一些特殊指令的優化,比如乘法指令的高32位運算或者計算指令的中間結果等。
x18/s2
它的作用是用于執行指令時暫存臨時數據,比如保存函數調用時的參數、局部變量等等。由于它是一個特殊寄存器,因此在CPU中還有一些特殊的用途。
x18寄存器還可以用于執行一些特殊操作,比如RISC-V CPU中的原子操作。原子操作需要在保證操作的原子性的同時,還需要快速地完成,因此x18寄存器就成了很好的選擇。此外,x18寄存器還可以用于實現一些編譯器優化,比如進行指令選取、指令調度等等。因此,x18寄存器可以看做是一個非常重要的寄存器,在程序運行過程中扮演著舉足輕重的角色。
x19/s3、x20/s4、x21/s6、x22/s7、x24/s8、x25/s9、x26/s10、x27/s11
這些寄存器可以用來存儲臨時變量或者函數參數等數據。在函數調用時,這些寄存器通常被用來存儲調用者保存的寄存器、返回地址或者參數值,具體使用方式取決于編程語言規范和系統調用規范。
傳參寄存器
x10/a0
x10 寄存器通常被稱為 a0 寄存器,在程序中,a0寄存器通常被用于存儲函數的輸入參數,也可以用于存儲函數的返回值。當函數被調用時,輸入參數的值被加載到a0寄存器中,并通過函數調用將參數傳遞給被調用的函數。被調用的函數可以將返回值存儲在a0寄存器中,并通過函數調用返回給調用方。
x11/a1、x12/a2、x13/a3、x14/a4、x15/a5、x16/a6、x17/a7
x11 ~ x17用于傳遞函數參數,從x11到x17分別對應函數第一個參數和第七個參數