指令集架構(ISA)

程式計數器

/ P-C /

程式計數器是處理器的書籤:一個特殊暫存器,存放機器即將執行的那條指令在記憶體中的位址。讀程式就像把一本書從上往下讀,而程式計數器就是你按在當前那一行上的手指。每執行完一條指令,它就前進到下一條,就像你的手指滑到下面那一行——而分支或跳躍,正是讓你能整個翻到另一頁的東西。

在機制上它是這樣運作的:要執行一條指令,處理器先提取程式計數器所指位址處的那條指令,接著(對普通指令而言)把程式計數器遞增,指向後面那條指令——在 RISC-V 中就是加 4,因為每條指令是 4 個位元組。分支與跳躍正是靠用一個算出來的位址覆寫程式計數器(而不是平常的 +4)來運作,使下一次提取從新的地方開始。因此程式計數器是唯一一塊捕捉「我此刻在程式的哪裡」的狀態。

雖然它是最重要的暫存器之一,它卻很特殊:在 RISC-V 中它不屬於那 32 個通用暫存器,你不能像用 x5 那樣把它當算術運算元用。它是隨著執行指令與控制流而被當作副作用更新的。一個微妙之處:程式計數器存的是一個「位址」(記憶體中的位置),不是「已執行了幾條指令的計數」——這名字是歷史遺留。當程式當掉時,存下來的程式計數器值往往是第一條線索,因為它精確告訴你當時正在執行哪條指令。

若程式計數器存著位址 0x1000,而那裡的指令是一條普通的加法,執行完後程式計數器變成 0x1004(下一條 4 位元組指令)。若那裡換成一個被採取的分支、目標是 0x2000,程式計數器就會跳到 0x2000。

正常情況下程式計數器只前進一條指令;分支與跳躍則覆寫它。

儘管名為「計數器」,程式計數器存的是一個位址,不是一個計次。而且它通常按指令大小前進(基本 RISC-V 中是 4 個位元組),不是按 1——所以「遞增 PC」意思是「加 4」,不是「加 1」。

又称
PCinstruction pointer指令指標