組合語言與 CPU
暫存器與通用暫存器
當你心算時,你會同時在腦中記住幾個數字——而不是為了每一位數都跑去翻檔案櫃。暫存器就是 CPU 版的「記在腦中」:一個直接建在處理器裡、極小且具名的儲存格,是數值能存放的最快位置。它們總共只有數十個,在 64 位元機器上每個剛好存 64 位元——也就是一個機器字組。
CPU 只能對放在暫存器裡的值做算術與邏輯運算。要把記憶體中的兩個數相加,它必須先把它們載入暫存器,做暫存器對暫存器的加法,再把結果存回記憶體——記憶體慢得多,所以 CPU 會把正在處理的值留在暫存器裡。通用暫存器就是程式可以自由運用、想拿來做什麼都行的那幾個暫存器:放迴圈計數器、放位址、放中間結果。在 x86-64 上它們叫 rax、rbx、rcx、rdx、rsi、rdi 以及 r8 到 r15;在 ARM/AArch64 上是 x0 到 x30。另有少數暫存器是專用的——程式計數器、堆疊指標、旗標暫存器各有固定職責。
暫存器解釋了編譯後程式碼的許多樣貌。編譯器把大量心力花在決定哪個變數該放在哪個暫存器(稱為暫存器配置),因為暫存器裡的值比記憶體裡的快得多。當同時存活的值多過暫存器數量時,編譯器會把一些「溢出」到堆疊上。這正是為什麼一個簡單 C 函式的反組譯結果裡,滿滿都是在暫存器與記憶體間搬移值的 mov 指令。
mov rax, 5 把數值 5 放進暫存器 rax;add rax, rbx 把 rbx 加進 rax,總和留在 rax 裡。
暫存器是 CPU 內部具名、固定寬度的儲存格;算術在這裡發生,不在記憶體裡。
暫存器不是記憶體位置:它有名字(rax)而沒有位址,所以你無法用 & 取它的位址。暫存器數量極少且由硬體固定——正是這種稀缺(而非偷懶)使編譯器在暫存器配置上如此費力。
又稱
另見