處理器:資料路徑與控制

符號擴展器(sign-extender)

指令常把一個小數字直接內嵌其中——像「從位址 x1 + 8 載入」裡的那個 8 這樣的常數偏移。但這個小數字只用指令內少數幾個位元儲存,而 ALU 處理的是全寬的值(比方說 64 位元)。符號擴展器就是把那個短數字加寬到全寬、卻不改變其值的小元件,好讓它能匯入資料路徑的其餘部分。想像在支票的大框裡寫金額:你把同一個數字抄進更多位數,正確地補位,使它仍代表同一件事。

訣竅在於補位必須遵守二補數中該數字的符號。正的立即值加寬時,新加的高位填 0;負的立即值加寬時,新加的高位填 1——你把原本的最高位(符號位元)複製到每一個新增的位元。於是 12 位元的 0b1111_1111_1111(也就是 -1)變成 64 位元時仍是 -1,而 0b0000_0000_1000(也就是 8)變成 64 位元的 8。這正是資料表示法那一節的符號擴展規則,如今化為一塊硬體:它只是接線加上把符號位元扇出,不需要任何邏輯閘。

為什麼在這裡重要:分支偏移與載入/儲存偏移可以是負的(你往回跳以形成迴圈,或定址到指標以下的記憶體)。符號擴展器保證負偏移在抵達 ALU 後仍是負的,於是「x1 - 4」這類定址與往回分支才能正確運作。若擴展錯了(把負數補零),迴圈就會跳到完全錯誤的位址。

一個 12 位元立即值 0xFFC 是二補數的 -4。符號擴展到 64 位元後變成 0xFFFF_FFFF_FFFF_FFFC——仍是 -4——做法是把最高位(一個 1)複製到所有新增的高位。用於「lw x5, -4(x1)」時,ALU 便算出 x1 減 4。

藉由複製符號位元,把短的立即值加寬到全寬,同時保留其有號值。

符號擴展與零擴展並不相同。對負偏移補零會把 -4 變成一個巨大的正數,那是真正的錯誤。要做符號擴展還是零擴展,屬於指令定義的一部分。

又稱
sign extension unit符號擴展單元