Register是在CPU內部的高速儲存空間,它是設計用來以遠高於一般記憶體的速度進行存取的動作。例如,當處理中的迴圈必須在速度上有最佳化效果時,迴圈計數器會儲存於暫存器而不是在變數中。
Purpose
Although the main registers (with the exception of the instruction pointer) are "general-purpose" and can be used for anything, it was envisioned that they be used for the following purposes:- AX/EAX/RAX: accumulator
- BX/EBX/RBX: base index (ex: arrays)
- CX/ECX/RCX: counter
- DX/EDX/RDX: data/general
- SI/ESI/RSI: "source index" for string operations.
- DI/EDI/RDI: "destination index" for string operations.
- SP/ESP/RSP: stack pointer for top address of the stack.
- BP/EBP/RBP: stack base pointer for holding the address of the current stack frame.
- IP/EIP/RIP: instruction pointer. Holds the program counter, the current instruction address.
引用來源:http://en.wikipedia.org/wiki/X86#x86_registers
Basic program execution registers(基本的程式執行暫存器):
- 8 個 General-Purpose Registers (通用暫存器)
EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI
- 6個 Segment Registers (區段暫存器)
CS, SS, DS, ES, FS, GS
- 1個 EFLAGS (用於儲存處理器狀態旗標的暫存器)
- 1個 EIP, Instruction Pointer (指令指標)
EBP, Base Pointer (基底指標),高階語言經常使用 EBP 來參照堆疊中的函數參數和局部變數 (local variable)。除非有高超的程式設計能否則不應將它用於平常的算術運算或資料搬移。因此,它通常稱為 Extended Frame Pointer Register (延伸框架指標暫存器)。
EAX, Extended Accumulator (延伸累加器),在執行乘法與法指令時,會自動使用 EAX 暫存器。
EBX, Base Index (ex: arrays)
ECX, Counter, CPU 會自動使用 ECX 當做迴圈計數器。
EDX, Data / General
ESP, Stack Pointer(堆疊指標), ESP 會用於定址在 Stack (堆疊)中的資料。
ESI, Extended Source Index (延伸來源索引)
EDI, Extended Destination Index (延伸目的索引)
ESI與EDI常用在高速的記憶體轉移指令。
Instruction Pointer(指令指標): 暫存器儲存著下一個即將執行的指令位址,有些特定的機器指令可以更動 EIP ,讓程式分支到新的位置去執行。
Segment Registers(區段暫存器): 在Real-Address Mode (實體位址模式)下, Segment Registers 用以定義 Segment 的 Base Address(基底位址), Segment 是預先指定的記憶體區域。在 Protected Mode 下, Segment Registers儲存的是”用於指向區段描述符表的指標”。有些 Segment 儲存的是程式指令(Code;程式碼),其他的 Segment 儲存的則是變數(Data;資料),另一種稱為 Stack Segment (堆疊區段)的區段,儲存的是局部變數以及函數參數。
CS, Code Segment
SS, Stack Segment
DS, Data Segment
ES, Extra Segment
FS, Flag Segment
GS, Global Segment
3.1-2 節區暫存器與指標暫存器
節區暫存器(segment register)又稱為段暫存器,在80386 CPU以下的規劃分別有CS、SS、DS、ES四個16位元的暫存器,386以後加入FS、GS兩個。規劃這些暫存器的主要目的是希望將主記憶體分成好幾個管理區域,分別可以指定給程式及不同目的的資料存放,例如CS就是規劃來指定給指令碼存放的區段,所以稱為指令段(code segment)暫存器,而SS為堆疊段(stack segment)暫存器,DS、ES分別為資料段(data segment) 及額外段(extra segment)暫存器,以及80386以後的CPU所加入的FS、GS分別為旗號段(flag segment) 及總體段(global segment)暫存器,這些段暫存器都可定義出特定資料存取的區段。
節區暫存器只關係著區段的粗略位址,80X86 CPU的實際位址必須仰賴節區暫存器與有效位址共同的計算來決定(請參照圖3-1及圖3-4),計算的方法為:
實際位址 = 節區暫存器位址 × 16 + 有效位址
每一種節區暫存器在特定目的下必須配合一個特定的指標暫存器一起使用,而指標暫存器的內容往往就是有效位址的一部份或全部(請參考下一節定址法),例如指令段(CS)暫存器必須配合指令指標(IP)暫存器定義出指令的有效位址,因此:
指令實際位址 = 指令節區暫存器 × 16 + 指令指標暫存器
由於指令實際位址都由CPU的程式計數器(PC)來決定,因此80×86CPU的PC = CS × 16 + IP。此處的CS × 16,對於二進碼而言,只需將CS左移四個位元,再補上四個0即可。
另外,堆疊段(SS)暫存器也沒有其他的選擇,必須配合堆疊指標(SP)暫存器一起使用定義出堆疊資料存放的實際位址。而字串處理(搬移、搜尋、比較)指令中,字串來源的位址被定義在資料段(DS)暫存器與來源索引(SI)暫存器中,處理後存放的目標位址則被定義在額外段(ES)暫存器與目標索引(DI)暫存器中。至於基底指標暫存器(BP)與堆疊段(SS)暫存器合用時,才可以存取堆疊段的資料。以上這些段暫存器與其可配合的指標暫存器,簡記於下:
CS:IP 指令段:指令指標
SS:SP 堆疊段:堆疊指標
DS:SI 資料段:來源索引
ES:DI 額外段:目標索引
SS:BP 堆疊段:基底指標
在眾多型態的指標暫存器當中,它們的儲存值都是可以被指令所更改或讀取的,唯一不能被使用者更改或讀取者就是指令指標(IP)暫存器,它僅隨指令的進行自動指向指令的提取位址,所以有些書籍是將它歸類在特殊暫存器當中。
例3-1 某程式碼置於記憶體AC00h的指令段,80×86CPU目前正要提取有效位址為1234h的指令操作碼,請問此操作碼在記憶體中的實際位址。
解: CS=AC00h,IP=1234h,
則 實際位址= CS×16+IP=AC000h +1234h =AD234h
沒有留言:
張貼留言