CPU Register Introduction
這篇會簡單介紹一下 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。