Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

x86 架構寄存器全景詳解:從 16 位到 32 位演進

編輯:Linux 教學

x86 處理器寄存器集合是理解汇編語言、編寫底層驅動、調試內核崩潰的基石。本文系統梳理 8086/80386 時代的通用、指針/變址、段、控制寄存器,闡述其位寬擴展、專用用途及編程模型。

一、 通用數據寄存器(General Purpose Registers)

四大 16 位寄存器可拆分為兩個 8 位子寄存器,32 位模式下擴展為 EAX/EBX/ECX/EDX(E 代表 Extended)。

16位高8位低8位32位擴展專用別名/用途
AXAHALEAX累加器:算術/邏輯/輸入輸出隱含使用
BXBHBLEBX基址寄存器:內存寻址基址(Base)
CXCHCLECX計數器:LOOP/REP/移位指令隱含計數
DXDHDLEDX數據寄存器:乘除法擴展/ I/O 端口地址

典型指令示例

  • MUL BL:AL × BL → AX
  • DIV CX:DX:AX / CX → 商 AX、餘數 DX
  • IN AL, DX:從 DX 指定端口讀入 AL
  • LOOP label:CX--,非零則跳轉

二、 指針與變址寄存器(Pointer & Index Registers)

僅支持 16 位操作,32 位模式下對應 ESI/EDI/EBP/ESP。

16位32位全稱核心用途
SPESPStack Pointer棧頂偏移,配合 SS 形成棧物理地址
BPEBPBase Pointer棧幀基址,訪問局部變量/參數
SIESISource Index串操作源地址(如 MOVSB)
DIEDIDestination Index串操作目標地址

三、 段寄存器(Segment Registers)

實模式下段基址 = 段值 × 16;保護模式下作為選擇子索引 GDT/LDT。

寄存器全稱控制區域
CSCode Segment代碼段(指令獲取)
DSData Segment默認數據段
SSStack Segment棧段
ESExtra Segment附加數據段(串操作目標)
FS/GS-386+ 新增,線程局部存儲等

物理地址計算(實模式):Physical = Segment × 16 + Offset

四、 控制寄存器(Control Registers)

1. 指令指針 IP / EIP

  • 存儲下一條指令在代碼段內的偏移地址。
  • 不可直接讀寫,通過 JMP/CALL/RET/INT/IRET 隱含修改。

2. 標志寄存器 FLAGS / EFLAGS(16/32 位)

由狀態標志、控制標志、系統標志組成:

系統標志(僅 EFLAGS,Ring 0 可修改)

  • IOPL (12-13):I/O 特權級,控制 IN/OUT/CLI/STI 指令權限。
  • NT (14):嵌套任務標志,任務切換相關。
  • RF (16):恢復標志,調試斷點控制。
  • VM (17):虛擬 8086 模式。
  • AC (18):對齊檢查啟用。
  • VIF/VIP (19-20):虛擬中斷標志/掛起,虛擬化支持。
  • ID (21):CPUID 指令支持標識。

五、 32 位保護模式新增寄存器

  • CR0-CR4:控制寄存器,管理分頁、保護模式、緩存、任務切換等核心功能。
  • GDTR/IDTR/LDTR/TR:描述符表寄存器與任務寄存器。
  • DR0-DR7:調試寄存器,硬件斷點。
  • MSR:模型專用寄存器(RDMSR/WRMSR 訪問),性能監控、電源管理、Syscall 入口等。

六、 編程實踐提示

  1. 函數調用約定:cdecl 調用者清棧,參數右至左入棧,返回值在 EAX/EDX:EAX。
  2. 內聯彙編約束:"=a"(ret) 指定輸出至 EAX,"b"(base) 輸入自 EBX。
  3. 上下文切換需保存:通用寄存器、段寄存器、EIP、EFLAGS、CR3(頁表基址)。
  4. 64 位模式(x86-64)進一步擴展為 RAX-RDX、R8-R15、RIP、RFLAGS,段寄存器基本廢棄(FS/GS 保留用於 TLS)。
Copyright © Windows教程網 All Rights Reserved
位縮寫全稱觸發條件/含義
0CFCarry Flag最高位進位/借位
2PFParity Flag結果低字節 1 的個數為偶數
4AFAuxiliary Carry第 3 位進位(BCD 運算用)
6ZFZero Flag結果為零
7SFSign Flag結果最高位為 1(負數)
11OFOverflow Flag有符號運算溢出
10DFDirection Flag串操作方向:1=遞減,0=遞增
9IFInterrupt Flag1=響應可屏蔽中斷(CLI/STI 修改)
8TFTrap Flag1=單步調試模式