指令集架構(ISA)

立即值

立即值是直接寫在指令本身裡的一個常數,而不是從暫存器或記憶體取來的。這名字來自一個概念:這個值是「立即」可得的——它就在指令的位元裡,不需要額外查找。如果暫存器運算元像是說「用第 6 號盒子裡裝的東西」,立即值就像是說「用數字 10,我現在當下就告訴你」。

程式中大多數固定常數都是以立即值的形式隨指令同行。把計數器加一、索引進結構偏移 8 個位元組、與零做比較——全都用一個烤進指令裡的小常數。在 RISC-V 中,「addi x5, x6, 10」的 10 是指令內一個 12 位元的立即值欄位;「lw x5, 8(x10)」的 8 是當作立即位移攜帶的。因為這個欄位只有那麼多位元寬(這些例子中是 12 位元),常數必須夠小;要載入一個大的 32 或 64 位元常數,編譯器會發出一小串指令把它分段組起來。

對於處理已知常數這種常見情況,立即值讓程式碼更快也更小——不需要另外的載入,也不浪費一個暫存器去存這個值。誠實的代價是範圍:立即值的位元寬度限制了一條指令能裝下多大的常數,而不同的 RISC-V 格式甚至把立即值的位元打散在整個指令字組中,好讓暫存器欄位維持在固定位置,這看起來怪,但讓硬體還原幾乎不花成本。立即值在使用前通常會被符號擴展到完整暫存器寬度,使一個小的負常數能正確運作。

「addi x5, x5, -1」把 x5 減一。這個 -1 是直接存在指令裡的立即值;硬體把它從 12 位元符號擴展到完整暫存器寬度,使它維持為負,再相加。

一個小常數隨指令同行,並在使用前被符號擴展。

立即值的大小受其位元欄位限制,所以你無法把一個任意的 64 位元常數塞進一條指令。大常數要靠兩條以上的指令組起來——這是定長編碼一個悄悄的代價。

又称
immediateimmediate valueinline constant立即運算元立即數