19 December 2013

X86 處理器寄存器(Registeren ,le registrefr ,das Registerde ,暫存器tw )是編寫 X86 彙編語言(Assembly Languageen ,langage d'assemblage ou langage assembleurfr ,Assemblersprachede ,組合語言tw )程序的核心工具。寄存器相當於處理器的一些內部變量。寄存器讀寫速度比內存更快,指令週期更少。本文簡單介紹一些 X86 系列處理器寄存器的使用方法。本文描述的一些使用規則只是一些建議性規則,而不是強制性規則。有些操作可能需要某些特定寄存器,但對於大部份寄存器,可以完全由你自己決定怎麼使用。

1 寄存器彙總

X86 系列處理器總共有下列 16 個 32 位寄存器。這些寄存器大部份可以拆分成 16 位或者 8 位寄存器使用。

  • 通用寄存器(General purpose registers-GPRs)

EAX EBX ECX EDX

  • 區段寄存器(Segment registersen ,des registres de segmentsfr

CS DS ES FS GS SS

  • 索引和指針(Index and pointer,le registre d'index et le pointeurfr ,Die Indexregister und Der Zeigerde

ESI EDI EBP EIP ESP

  • 狀態寄存器(status register, flag register, or condition code registeren ,das Zustandsregister order das Statusregisterde

EFLAGS

EAX 等寄存器的前綴 E 來自英語 Extended(擴展的)。因為最初的 Intel 8086/8088 處理器只有 14 個 16 位寄存器。其中 4 個通用寄存器(AX,BX,CX,DX);2 個指針寄存器(SP,BP),2 個索引寄存器(SI,DI),4 個區段寄存器(CS,DS,SS,ES),1 個狀態寄存器(FLAGS),1 個指令指針寄存器(IP)。而 32 位的 80386 處理器把其中的 16 位的通用寄存器,指針寄存器,索引寄存器,指令指針寄存器,以及狀態寄存器擴展成 32 位寄存器。比如 AX 寄存器對應到了新的 32 位寄存器 EAX 的低 16 位,SI 寄存器對應到 32 位寄存器 ESI 的低 16 位。注意,區段寄存器沒有 E 前綴,仍然保留 16 位的大小。

2 通用寄存器(General Purpose Registers - GPRsen

我們大部份時間大部份指令都在用的寄存器叫做通用寄存器。這些寄存器可以再分解成 16 位或者 8 位的寄存器。

32 位寄存器 EAX EBX ECX EDX
16 位寄存器 AX BX CX DX
8 位寄存器 AH AL BH BL CH CL DH DL

H 和 L 分别表示 16 位中的高 8 位和低 8 位。

我们再看看这四组通用寄存器其有哪些细微的差别。

EAX,AX,AH,AL
累加寄存器(Accumulator registeren ,le accumulateurfr ,der Akkumulatorde )一般用来处理 I/O 端口访问,数学计算,中断调用等。
EBX,BX,BH,BL
基址寄存器(Base registeren )一般用以內存訪問時候的基址指針,以及獲取某些中斷函數的返回值。
ECX,CX,CH,CL
計數寄存器(Counter registeren )一般用在循環計數和位移操作中,還用來獲取某些中斷函數的返回值。
EDX,DX,DH,DL
數據寄存器(Data registeren )和累加寄存器一樣用来处理 I/O 端口访问,数学计算,中断调用等。

3 區段寄存器(Segment registersen

區段寄存器保存若干區段的地址。區段寄存器只能通過通用寄存器或者特殊指令修改。

CS
代碼段寄存器(Code segment register)記錄程序運行的代碼段地址。人為修改會導致程序無法正確運行。
DS
數據段寄存器(Data segment register)記錄程序訪問的數據段地址。人為修改可能導致錯誤的數據。
ES,FS,GS
這幾個額外的區段寄存器用以 far 指針訪問,比如視頻內存等。
SS
棧區段寄存器(Stack segment register)記錄程序使用的棧區段地址。有時候 SS 和 DS 是一樣的。人為修改會導致無法預期的數據結果。

4 索引和指針寄存器(Indexes and pointersen

索引和指針寄存器用作區段地址的偏移量。 E 開頭的寄存器只在保護模式(Protected Modeen )下使用。

ES:EDI EDI DI
目的索引寄存器(Destination index registeren )用作字符串、數組拷貝目的地址,以及和 ES 配合 far 指針尋址。
DS:ESI ESI SI
源索引寄存器(Source index registeren )用作字符串、數組拷貝的源地址。
SS:EBP EBP BP
棧基址指針寄存器(Stack Base pointer registeren )保存程序棧的基地址。
SS:ESP ESP SP
棧指針寄存器(Stack pointer registeren )保存程序棧的棧頂地址。
CS:EIP EIP IP
程序指針(Instruction Pointeren )保存下一條指令的偏移地址。

5 狀態寄存器(EFLAGS register)

EFLAGS 狀態寄存器保存當前處理器的狀態。 EFLAGS 用作條件跳轉,條件循環,數值比較。每一位都可以用來表示上一條特定指令的執行結果。每一位的功能如下:

標記 描述
0 CF Carry flag
1   Reserved
2 PF Parity flag
3   Reserved
4 AF Auxiliary carry flag
6 ZF Zero flag
7 SF Sign flag
8 TF Trap flag
9 IF Interrupt enable flag
10 DF Direction flag
11 OF Overflow flag
12-13 IOPL I/O Privilege level
14 NT Nexted task flag
15   Reserved
16 RF Resume flag
17 VM Virtual 8086 mode flag
18 AC Alignment check flag
19 VIF Virtual interrupt flag
20 VIP Virtual interrupt pending flag
21 ID ID flag
22-31   Reserved