運算碼
/ OP-code /
運算碼是一條指令中說明「要做什麼」的那一部分。如果一條指令是一個句子,運算碼就是動詞。處理器讀進一條進來的指令、看它的運算碼欄位,那就告訴它:這是加法、載入、儲存,還是分支?指令的其餘部分(暫存器編號、任何常數)是「對誰、用什麼」——也就是名詞——而運算碼是「動作」。
具體來說,運算碼是一小組有固定意義的位元。處理器內部的解碼器檢視這些位元,像在密碼本中查一個詞那樣,把這個位元樣式對應到一種運算,然後把機器的其餘部分安排好去執行它。在 RISC-V 中,主運算碼是一個 7 位元欄位,有時由額外的「功能」欄位(function3 與 function7)協助,在加法與減法共用同一個頂層運算碼時把它們區分開來——所以「運算碼」寬鬆地指「選出運算的整組位元」。相對地,在 x86 中,運算碼可以是一或數個位元組,長度還會變動。
為何重要:運算碼是解碼最先依賴的東西,因此它的擺放與大小,形塑了一顆處理器能有多快、多簡單。保留運算碼空間也是 ISA 成長的方式——擴展中每一條新指令都需要一個尚未使用的運算碼樣式,而「運算碼空間用光」是 ISA 設計者要規劃數十年去因應的真實、實際的限制。一個微妙之處:同一個人類可讀的助憶符(「add」)對應到一個特定的運算碼位元樣式,但助憶符是給人看的;運算碼才是矽晶片真正讀的東西。
在 RISC-V 中,「add」與「sub」共用同一個 7 位元運算碼來表示暫存器算術;接著 function7 位元不同,用以區分兩者。所以運算碼說「這是暫存器數學運算」,再由一個輔助欄位說「具體來說,是減法」。
運算碼挑出大類運算;輔助欄位則能再把它縮小。
運算碼空間有限且珍貴。ISA 不能免費無限加入新指令——每一條都消耗一個編碼槽位,這正是為什麼成熟的 ISA 是謹慎地累積擴展,而不是隨興塞入指令。