指令格式
指令格式是一張固定的藍圖,規定一條指令的哪些位元代表什麼。對處理器而言,一條指令不過是一串位元——例如 32 個 1 與 0。格式就是約定好把那串位元切成具名欄位的方式,就像一張有格子的紙本表單:這格是姓、那格是日期。沒有格式,這些位元毫無意義;有了它,硬體就知道這些位元是運算、那些位元指名一個暫存器,其餘的是一個數字。
RISC-V 有一小組格式,好讓解碼保持簡單。R 型格式(暫存器對暫存器的算術)把它的 32 位元切成數個欄位:一個運算碼加上額外的功能位元以指明是哪種運算、兩個來源暫存器編號、一個目的暫存器編號。I 型格式(載入與加立即值用)把其中一個來源暫存器換成一個 12 位元的立即常數。另外還有給儲存與分支用的格式,它們以不同方式打包立即值。關鍵在於,暫存器編號欄位在各格式中都落在相同的位元位置,於是硬體還沒搞清楚確切是哪種運算,就能開始讀暫存器編號了。
規律、定長格式的全部重點就是速度與簡單。如果每條指令同寬、欄位又對齊,晶片就能瞬間找到運算碼與暫存器編號,完全不必猜下一條指令從哪開始。這是 RISC 設計能如此乾淨地管線化的核心原因之一。代價是定長 32 位元指令可能浪費空間,也限制了你能攜帶的立即值有多大——而這正是 CISC 設計以變長指令採取不同解法的那股張力。
像「add」這樣的 RISC-V R 型指令,把它的 32 位元排成:[function7 | rs2 | rs1 | function3 | rd | opcode]。運算碼與功能位元合起來選出「add」;rs1 與 rs2 指名兩個輸入;rd 指名結果要去哪裡。
各格式中相同的欄位落在相同的位置,正是定長解碼之所以快速的原因。
定長是一種 RISC 的選擇,不是自然法則。像 x86 這樣的 CISC ISA 使用變長指令(1 到 15 個位元組),好讓每條指令塞進更多意義——程式碼更密,但解碼更難也更慢。