指令集架構(ISA)

定址模式

定址模式是一條指令「如何指明它的資料從哪來」的規則。想想你能用幾種方式告訴快遞員東西要送到哪:「交給 6 號辦公室的那個人」(用某個暫存器的值)、「東西本身就在這」(一個立即常數),或「去這張紙條上的位址,再往前走三扇門」(一個基底位址加一個偏移)。每一種都是不同的定址模式,而 ISA 精確定義它支援哪些。

RISC-V 把這份清單保持得短而簡單,這非常符合 RISC 的精神。暫存器定址表示運算元是某個具名暫存器中的值。立即定址表示運算元是指令攜帶的一個常數。載入與儲存所用的基底加位移(也稱基底加偏移)定址,是把一個小的常數位移加到基底暫存器的值上來構成記憶體位址——非常適合存取某個起點在暫存器裡的結構中偏移 8 的欄位。分支與某些跳躍所用的 PC 相對定址,是把一個偏移加到程式計數器上來構成目標位址,使同一段程式碼無論被載入到記憶體何處都能運作。

定址模式之所以重要,是因為它們決定了常見樣式有多自然地對應到單一指令。基底加位移使陣列與結構存取成為乾淨的一步;PC 相對定址正是程式碼可重定位的原因。這裡有一個直指 RISC 與 CISC 核心的誠實對比:像 x86 這樣的 CISC ISA 提供許多繁複的模式(例如「基底暫存器加上索引暫存器乘以一個比例再加一個位移」全在一條指令裡算完),這讓每條指令塞進更多工作,卻也使每條指令更難解碼與執行。RISC 刻意只提供少數幾種簡單模式,改讓編譯器去組合平凡的指令。

若要讀取一個整數陣列的第 i 個元素(陣列基底在 x10),編譯器把偏移(i 乘以 4 位元組)算進 x5、加到基底上,再用基底加位移:「lw x6, 0(x5)」。這裡的位移是 0;位址來自基底暫存器。

基底加位移,把「從這裡偏移 N 處的那個元素」變成一條載入指令。

RISC-V 那一小組定址模式是優點,不是缺陷。豐富的 CISC 模式每條指令做得更多,卻付出解碼與執行的複雜度代價——這正是 RISC 與 CISC 核心的取捨,而非某一方就單純更好。

又称
addressing modesoperand addressing定址方式尋址模式