CPU Register Introduction

1 minute read

這篇會簡單介紹一下 CPU 的 register ,以下的環境採用 intel 32-bit 80x86 CPU 做解釋。

CPU registers

CPU 裡面有許多的 register,他們的存取速度比記憶體 (RAM) 快,能夠幫助 CPU 進行高速的運算。

Data register (general register)

長度都是 32-bit,是一般運算最常用的幾個 register,命名如下:

  • EAX: Accumulator,加法、常見運算大多用這個
  • EBX: Base,存取記憶體時用
  • ECX: Count, 例:迴圈計數器
  • EDX: Data,存放一些多的資料,如放除法的餘數

不過有時候會發現,他的功用與命名未必相關,這也是為什麼他們又稱作 general register的原因。另外這個 E 是 extended 的意思,因為原本的 AX, BX … 是 16-bit 的關係,所以 EAX 的全名是 Extended accumulator register

此外,還有一些常見的稱呼,B, C, D 依此類推:

  • AX: 表示 EAX[0] (第 0 個 bit) ~ EAX[15] (第 15 個 bit),共 16 bits,注意 bit 是要從右邊往左數。
  • AH: (H: high) 表示 EAX[8] ~ EAX[15],共 8 bits
  • AL: (L: low) 表示 EAX[0] ~ EAX[7],共 8 bits

範例:

假設 EAX = 0x12345678

AX = 0x5678
AH = 0x56
AL = 0x78

*在64-bit 環境下,EAX 指的是 EAX[0] ~ EAX[31]。

Index register

一樣是 32-bit,功用也一樣不限制在命名上。

  • ESI: source index, 常用在字串、陣列的處理上。
  • EDI: destination index, 常用在字串、陣列的處理上。
  • ESP: stack pointer,指向記憶體裡 stack 的最底層(因為 stack 往低位址增長)
  • EBP: base pointer,用於 function call 時計算相對記憶體位置

ESP, EBP 很少會去直接更改它,或是用來做計算使用,通常會給他們用做上述的特定用途,例如函數呼叫便會操作這兩個 register,詳情請參考另一篇文章

Segment register

用 flat 32-bit memory model 下,這些 register 並不重要,所以只稍加帶過,這些 register 是舊時代的產物。

這些都是 16-bit 的 register:

  • CS: code segment
  • DS: data segment
  • ES: extra segment
  • SS: stack segment
  • FS: additional segment
  • GS: additional segment

Instruction register

這是個很特別的 32-bit register,全名是 EIP (instruction pointer),在 80x86 中也是所謂的 PC (program counter),它讓 CPU 知道下一步要運行那一個位址的指令,大部分情況下這個值會等差增加,讓指令一行一行跑。

Flags register

進行加減乘除運算的時候,根據結果的不同,EFLAGS (flag register) 的某些 bit 會被設為指定的狀態,例如:

  • CF: carry flag
  • ZF: zero flag
  • SF: sign flag …

這些結果通常會被組合語言指令 cmp 使用,藉由 EFLAGS 判斷一些條件,例如兩個數字的大小。

整個 EFLAGS 是 32-bit。

64-bit machine

如果是 64-bit 的環境,其實就是把 EAX 變成 RAX,長度由 32-bit 增加為 64-bit。

上述的 register 中,除了 segment register 之外,全都是把 E 換成 R 並變成 64-bit 而已,功用相同。

此外,再增加 8 個額外的 64-bit register ,用於一般計算,叫做 R8, R9 … R15。