指令集架構(ISA)

分支與跳躍指令

分支與跳躍指令決定「接下來去哪裡」。處理器通常會一條接一條、直線地讀指令,就像順著一頁往下讀。但真實程式需要做選擇(「如果餘額是負的,就做這個」)並重複工作(「一直加到清單結束為止」)。控制流指令就是這條路上的岔路與繞道:它們改變「下一條執行哪條指令」,而不是只往下一條落下去。

分支是有條件的——它測試某件事,只有在測試通過時才改道,否則照常往下執行。在 RISC-V 中,「beq x5, x6, target」的意思是「若 x5 等於 x6 則分支到 target」,而「blt x5, x6, target」是「若 x5 小於 x6 則分支」。跳躍通常是無條件的——它總是改道,用來實作函式呼叫與無條件的「跳到這裡」控制。在機制上,兩者都是靠改變程式計數器(存放下一條指令位址的暫存器)來運作:分支或跳躍算出一個新位址、把它載入程式計數器,於是下一次提取就從那裡開始。

這些指令是高階語言中每一個「if」、迴圈、函式呼叫與「return」最終的建構方式。迴圈不過是一次算術測試後接一個往回的分支;「if/else」則是一個分支,跳過這一塊或那一塊。它們也是高效處理器為何如此費勁做分支預測的原因:因為機器想持續往前提取,它必須在真正知道答案之前先猜分支會往哪走——不過那是微架構的事,並不屬於 ISA 契約本身。

一個倒數迴圈:在迴圈頂端,「beq x5, x0, done」在計數器 x5 歸零時分支跳出;否則執行主體,「addi x5, x5, -1」把它減一,再用「j top」跳回去。分支結束迴圈;跳躍重複迴圈。

迴圈與「if」是由一個條件分支加一個無條件跳躍組成的。

分支只是「選一個位址」,它並不會「記得自己從哪來」。函式呼叫需要另外存下返回位址(這是跳躍-連結指令加上呼叫慣例的工作),否則程式就無路可回。

又称
control transfer instructionsbranchjumpcontrol flow控制流指令分支指令跳躍指令