x86 處理器寄存器集合是理解汇編語言、編寫底層驅動、調試內核崩潰的基石。本文系統梳理 8086/80386 時代的通用、指針/變址、段、控制寄存器,闡述其位寬擴展、專用用途及編程模型。
四大 16 位寄存器可拆分為兩個 8 位子寄存器,32 位模式下擴展為 EAX/EBX/ECX/EDX(E 代表 Extended)。
| 16位 | 高8位 | 低8位 | 32位擴展 | 專用別名/用途 |
|---|---|---|---|---|
| AX | AH | AL | EAX | 累加器:算術/邏輯/輸入輸出隱含使用 |
| BX | BH | BL | EBX | 基址寄存器:內存寻址基址(Base) |
| CX | CH | CL | ECX | 計數器:LOOP/REP/移位指令隱含計數 |
| DX | DH | DL | EDX | 數據寄存器:乘除法擴展/ I/O 端口地址 |
MUL BL:AL × BL → AXDIV CX:DX:AX / CX → 商 AX、餘數 DXIN AL, DX:從 DX 指定端口讀入 ALLOOP label:CX--,非零則跳轉僅支持 16 位操作,32 位模式下對應 ESI/EDI/EBP/ESP。
| 16位 | 32位 | 全稱 | 核心用途 |
|---|---|---|---|
| SP | ESP | Stack Pointer | 棧頂偏移,配合 SS 形成棧物理地址 |
| BP | EBP | Base Pointer | 棧幀基址,訪問局部變量/參數 |
| SI | ESI | Source Index | 串操作源地址(如 MOVSB) |
| DI | EDI | Destination Index | 串操作目標地址 |
實模式下段基址 = 段值 × 16;保護模式下作為選擇子索引 GDT/LDT。
| 寄存器 | 全稱 | 控制區域 |
|---|---|---|
| CS | Code Segment | 代碼段(指令獲取) |
| DS | Data Segment | 默認數據段 |
| SS | Stack Segment | 棧段 |
| ES | Extra Segment | 附加數據段(串操作目標) |
| FS/GS | - | 386+ 新增,線程局部存儲等 |
物理地址計算(實模式):Physical = Segment × 16 + Offset
JMP/CALL/RET/INT/IRET 隱含修改。由狀態標志、控制標志、系統標志組成:
| 位 | 縮寫 | 全稱 | 觸發條件/含義 |
|---|---|---|---|
| 0 | CF | Carry Flag | 最高位進位/借位 |
| 2 | PF | Parity Flag | 結果低字節 1 的個數為偶數 |
| 4 | AF | Auxiliary Carry | 第 3 位進位(BCD 運算用) |
| 6 | ZF | Zero Flag | 結果為零 |
| 7 | SF | Sign Flag | 結果最高位為 1(負數) |
| 11 | OF | Overflow Flag | 有符號運算溢出 |
| 10 | DF | Direction Flag | 串操作方向:1=遞減,0=遞增 |
| 9 | IF | Interrupt Flag | 1=響應可屏蔽中斷(CLI/STI 修改) |
| 8 | TF | Trap Flag | 1=單步調試模式 |