寄存器是集成電路中非常重要的一種存儲單元,通常由D觸發器組成。在集成電路設計中,寄存器可分為電路內部使用的寄存器和充當內外部接口的寄存器這兩類。內部寄存器不能被外部電路或軟件訪問,只是為內部電路的實現存儲功能或滿足電路的時序要求。而接口寄存器可以同時被內部電路和外部電路或軟件訪問,CPU中的寄存器就是其中一種,作為軟硬件的接口,為廣泛的通用編程用戶所熟知。
寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。寄存器是內存階層中的最頂端,也是系統獲得操作資料的最快速途徑。寄存器通常都是以他們可以保存的位元數量來估量,舉例來說,一個“8位元寄存器”或“32位元寄存器”。
16位寄存器
以8086(16位處理器,14個寄存器)為例。按其用途可分為:
-
通用寄存器(8個):
-
數據寄存器
AH&AL=AX(accumulator):累加寄存器,常用於運算;在乘除等指令中指定用來存放操作數,另外,所有的I/O指令都使用這一寄存器與外界設備傳送數據。
BH&BL=BX(base):基址寄存器,常用於地址索引。
CH&CL=CX(count):計數寄存器,常用於計數,常用於保存計算值。如在移位指令,循環(loop)和串處理指令中用作隱含的計數器。
DH&DL=DX(data):數據寄存器,常用於數據傳遞。
這4個16位的寄存器可以分為高8位:AH,BH,CH,DH。以及低八位:AL,BL,CL,DL。這2組8位寄存器可以分別尋址,並單獨使用。
-
指針寄存器和變址寄存器:
SP(Stack Pointer):堆棧指針,與SS配合使用,可指向目前的堆棧位置。BP(Base Pointer):基址指針寄存器,可用作SS的一個相對基址位置。SI(Source Index):源變址寄存器,可用來存放相對於DS段之源變址指針。DI(Destination Index):目的變址寄存器,可用來存放相對於ES 段之目的變址指針。
這4個16位寄存器只能按16位進行存取操作,主要用來形成操作數的地址,用於堆棧操作和變址運算中計算操作數的有效地址。
-
-
指令指針(1個):
指令指針IP是一個16位專用寄存器,它指向當前需要取出的指令字節,當BIU從內存中取出一個指令字節后,IP就自動加(取出該字節的長度,如:BIU從內存中取出的是1個字節,IP就會自動加1,如果BIU從內存中取出的字節數長度為3,IP就自動加3),指向下一個指令字節。注意,IP指向的是指令地址的段內地址偏移量,又稱偏移地址(Offset Address)或有效地址(EA,Effective Address)。
BIU是80x86微處理系統芯片中的兩個基本功能部件之一,中文為總線接口部件(Bus Interface Unit)。BIU是和總線打交道的接口部件,它根據執行單元(Execution Unit)的請求,執行8086 CPU 對存儲器或 I/O 接口的總線操作,完成數據傳送,BIU由指令隊列緩沖器,16位指令指針寄存器CS、DS、SS和ES,地址產生器和段寄存器,總線控制邏輯等部分構成。
-
標志寄存器(1個):
標志寄存器(Flags Register,FR)又稱程序狀態字(Program Status Word,PSW)。這是一個存放條件標志、控制標志寄存器,主要用於反映處理器的狀態和運算結果的某些特征及控制指令的執行。
在FR中有意義的有9位,其中6位是狀態位,3位是控制位。
-
-
標志 | 描述 |
---|---|
CF(carry flag) | 進位標志,主要用來反映無符號數運算是否產生進位或借位。如果運算結果的最高位產生了一個進位或借位,那么,其值為1,否則其值為0。 |
PF(parity flag) | 奇偶標志,用於反映運算結果中“1”的個數的奇偶性。如果“1”的個數為偶數,則PF的值為1,否則其值為0。 |
AF(adjust flag) | 輔助進位標志,存在下列情況值被置為1,否則其值為0:在字操作時,發生低字節向高字節進位或借位時;在字節操作時,發生低4位向高4位進位或借位時。 |
ZF(zero flag) | 零標志,用來反映運算結果是否為0。如果運算結果為0,則其值為1,否則其值為0。在判斷運算結果是否為0時,可使用此標志位。 |
SF(sign flag) | 符號標志,用來反映運算結果的符號位,它與運算結果的最高位相同。在微機系統中,有符號數采用補碼表示法,所以,SF也就反映運算結果的正負號。運算結果為非負數時,SF的值為0,否則其值為1。當運算結果沒有產生溢出時,運算結果等於邏輯結果(即應該得到的正確的結果),此時SF表示的是邏輯結果的正負,當運算結果產生溢出時,運算結果不等於邏輯結果,此時的SF值所表示的正負情況與邏輯結果相反,即:SF=0時,邏輯結果為負,SF=1時,邏輯結果為非負。 |
TF(trap flag) | 跟蹤標志,可用於程序調試。TF標志沒有專門的指令來設置或清除。如果TF=1,則CPU處於單步執行指令的工作方式,此時每執行完一條指令,就顯示CPU內各個寄存器的當前值及CPU將要執行的下一條指令。如果TF=0,則處於連續工作模式。 |
IF(interrupt enable flag) | 中斷允許標志,用來決定CPU是否響應CPU外部的可屏蔽中斷發出的中斷請求。但不管該標志為何值,CPU都必須響應CPU外部的不可屏蔽中斷所發出的中斷請求,以及CPU內部產生的中斷請求。具體規定如下:當IF=1時,CPU可以響應CPU外部的可屏蔽中斷發出的中斷請求;當IF=0時,CPU不響應CPU外部的可屏蔽中斷發出的中斷請求。 |
DF(direction flag) | 方向標志,用來決定在串操作指令執行時有關指針寄存器發生調整的方向。 |
OF(overflow flag) | 溢出標志,用於反映有符號數加減運算所得結果是否溢出。如果運算結果超過當前運算位數所能表示的范圍,則稱為溢出,OF的值被置為1,否則,OF的值被清為0。 |
-
段寄存器(4個):
-
CS(Code Segment):代碼段寄存器
-
DS(Data Segment):數據段寄存器
- SS(Stack Segment):堆棧段寄存器
- ES(Extra Segment):附加段寄存器
-
當一個程序要執行時,就要決定程序代碼、數據和堆棧各要用到內存的哪些位置,通過設定段寄存器CS,DS,SS來指向這些起始位置。通常是將DS固定,而根據需要修改CS。所以,程序可以在可尋 址空間小於64K的情況下被寫成任意大小。所以,程序和其數據組合起來的大小,限制在DS所指的64K內,這就是COM文件不得大於64K的原因。8086以內存作為戰場,用寄存器做為軍事基地,以加速工作。
備注:由於所講的是16位cpu,IP寄存器的位數為16,即:偏移地址為16位,2的16次冪就是64K,所以16位段地址不能超過64K,超過64K會造成64K以上的地址找不到。
32位寄存器
32位CPU 寄存器及數據結構圖:
-
通用寄存器(8個):EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI
-
盡管這8個通用寄存器大多時候是通用的,可以用作任何用途,但是在某些情況下,他們也有隱含的用法。比如ECX、ESI和EDI在串循環操作中分別用作計數器、源和目標。EBP和ESP主要用來維護棧,ESP通常指向棧的頂部,EBP指向當前棧幀的起始地址。
-
EAX, EBX, ECX, EDX都可以作為32位寄存器、16位寄存器或者8位寄存器使用。用法類似16位數據寄存器。
-
EBP和ESP是32位寄存器,也可作為16位寄存器BP, SP使用,常用於椎棧操作。
-
EDI和ESI常用於串操作,EDI用於尋址目標數據串,ESI用於尋址源數據串。
-
-
標志寄存器(1個):EFLAGS
控制任務狀態和模式切換、中斷處理、指令追蹤和訪問權限控制.寄存器中的標志位需要特權指令代碼才可以修改(特權指令:運行在內核態下的代碼)
在16位標志寄存器的基礎上增加了幾個標志:
標志 | 描述 |
---|---|
IOPL(I/O privilege level field) | 指示當前運行任務的I/O特權級(I/O privilege level),正在運行任務的當前特權級(CPL)必須小於或等於I/O特權級才能允許訪問I/O地址空間。這個域只能在CPL為0時才能通過POPF以及IRET指令修改。 |
NT(Nested task flag) | 控制中斷鏈和被調用任務。若當前任務與前一個執行任務相關則置1,反之則清零。 |
RF(Resume flag) | 控制處理器對調試異常的響應。 |
VM(Virtual-8086 mode flag) | 置1以允許虛擬8086模式,清除則返回保護模式。 |
AC(Alignment check flag) | 該標志以及在CR0寄存器中的AM位置1時將允許內存引用的對齊檢查,以上兩個標志中至少有一個被清零則禁用對齊檢查。 |
VIF(Virtual interrupt flag) | 該標志是IF標志的虛擬鏡像(Virtual image),與VIP標志結合起來使用。使用這個標志以及VIP標志,並設置CR4控制寄存器中的VME標志就可以允許虛擬模式擴展(virtual mode extensions) |
VIP(Virtual interrupt pending flag) | 該位置1以指示一個中斷正在被掛起,當沒有中斷掛起時該位清零。(Software sets and clears this flag; the processor only reads it)與VIF標志結合使用。 |
ID(Identification flag) | 程序能夠設置或清除這個標志指示了處理器對CPUID指令的支持。 |
- 控制寄存器(5個):CR0-CR4
控制寄存器決定處理器的操作模式和當前執行任務的一些特征。
-
- CR0:控制系統的工作模式和處理器的狀態;x86_32的CR0為32bit。X86_64下為64bit,其中低32bit與x86_32的CR0保持一致,高32bit沒有定義,作保留使用,除了bit4其他所有位都是可讀可寫的。
標志 | 描述 |
---|---|
PE(Protected-Mode Enable) | PE=0,表示CPU處於實模式;PE=1表CPU處於保護模式,並使用分段機制。 |
MP | 協處理器監視標志位 |
EM | 該位表明是否需要仿真協處理器的功能 |
TS | 每當任務切換時就設置該位,並且在解釋協處理器指令之前測試該位 |
ET | 擴展類型。設置有效位時,支持 ntel 387 DX 數學協處理器指令 |
NE | 數字錯誤標志位(與浮點協處理器共同使用) |
WP | 寫保護 |
AM | 對齊功能屏蔽(與EFLAGS寄存器中 AC標志位一同使用) |
NW | 直寫無效(直寫:高速緩存中的數據始終保持與主存儲器中數據匹配,也叫做通寫 ) |
CD | cache 缺失設置位 |
PG(Paging Enable) | 控制分頁機制,PG=1,啟動分頁機制;PG=0,不使用分頁機制。 |
-
- CR1:保留
- CR2:存放發生頁錯誤時的虛擬地址
-
- CR3:用來存放最高級頁目錄地址(物理地址),各級頁表項中存放的也是物理地址。
標志 | 描述 |
---|---|
PWT(Page-Level Writethrough) | 控制cache采取直寫還是回寫的策略。當設置清空時,回寫有效。當置位時,直寫有效 |
PCD(Page-Level Cache Disable) | PCD=1,表示最高目錄表不可緩存,PCD=0,相反 |
- Figure 3-4中,不使用PAE技術,有兩層頁表。最高層為頁目錄有1024項,占用4KB。page_directory_table base address為物理地址,指向4KB對齊的頁目錄地址。
- Figure 3-5中,使用PAE技術,三層頁表尋址。最高層為頁目錄指針,4項,占用32B空間。所以 page_directory_table base address為27位,指向32B對齊的頁目錄指針表。
-
- CR4:一些結構的擴展。表明對於特定的處理器和操作系統執行支持。
標志 | 描述 |
---|---|
VME(virtual 8086 mode extension) | 虛擬8086模式擴展位。VME=1,允許虛擬8086擴展,即允許8086模式和虛擬8086中斷。VME=0,禁止虛擬8086模式擴展。 |
PVI(protected mode virtual interrupts) | 保護模式虛擬中斷位。PVI=1,允許保護模式虛擬中斷。PVI=0,禁止保護模式虛擬中斷。 |
TSD(time stamp disable) | 禁止RDTSC指令位。TSD=0,則允許RDTSC(讀時間標志計算器)指令在任何特權級上執行。TSD=1,僅允許RDTSC指令在0級特權級上執行,否則將發生一般保護模式異常。 |
DE(debugging extensions) | 調試擴展位。DE=1,允許輸入/輸出斷點。DE=0,不支持輸入/輸出斷點。 |
PSE(page size extensions) | 允許頁容量大小擴展位。PSE=1,允許每頁容量為4MB。PSE=0,只允許每頁容量為4KB。 |
PAE(physical address extension) | 允許物理地址擴展位。PAE=1,允許采用32位以上的物理地址(包括32位和64位地址)。PAE=0,只允許采用32位物理地址。 |
MCE(machine check exception) | 允許機器檢查異常位。MCE=1,允許機器檢查異常。MCE=0,不允許機器檢查異常。 |
PGE(Page-Global Enable) | 將PGE設置為1可啟用全局頁面機制。將該位清除為0將禁用該機制。當啟用PGE時,系統軟件可以將頁面轉換層級的最低級別的全局頁面(G)位設置為1,表示頁面翻譯是全局的。當頁面翻譯表基地址(CR3)更新時,標記為全局的頁面翻譯在TLB中不會失效。 |
PCE(Performance-Monitoring Counter Enable) | 將PCE設置為1允許在任何權限級別運行的軟件使用RDPMC指令。軟件使用RDPMC指令讀取性能監視MSRs PerfCtrn。 將PCE清除為0僅允許最特權的軟件(CPL = 0)使用RDPMC指令。 |
OSFXSR(FXSAVE/FXRSTOR Support) | 設置為1,以使能256位和128位媒體指令。當該位設置為1時,它還指示系統軟件使用FXSAVE和FXRSTOR指令來保存和恢復x87,64位介質和128位介質指令的處理器狀態。 |
OSXMMEXCPT(Unmasked Exception Support) | 當系統軟件支持SIMD浮點異常(#XF)來處理未屏蔽的256位和128位媒體浮點錯誤時,系統軟件必須將OSXMMEXCPT位設置為1。將OSXMMEXCPT位清除為0表示不支持#XF處理程序。 當OSXMMEXCPT = 0時,未屏蔽的128位媒體浮點異常會導致無效操作碼異常 |
OSXSAVE(XSAVE and Extended States) | 設置為1,則操作系統支持XGETBV,XSETBV,XSAVE和XRSTOR指令。處理器也將能夠執行XGETBV和XSETBV指令,以讀寫XCR0。 |
-
調試寄存器(8個):DR0-DR7
調試寄存器主要作用是調試應用代碼、系統代碼、開發多任務操作系統.來監視代碼的運行和處理器的性能。
DR0-DR3:保留32位斷點的線性地址。
DR4-DR5:保留。
DR6:
標志 | 描述 |
---|---|
B0-B3 | 斷點狀態的監測 |
BD | 調試寄存器訪問監測。置位,表明在指令流中,下一條指令將訪問其中的一個調試寄存器 |
BS | 單步執行標志位 |
BT | 任務轉換標志位 |
DR7:
標志 | 描述 |
---|---|
L0-L3 | 局部斷點使能標志位 |
G0-G3 | 全局斷點使能標志位 |
LE GE | 置位,表明處理器可以監測導致數據斷點的指令。推薦置位為1 |
GD | 通用監測使能標志位。表明是否開啟調試寄存器保護 |
LEN0 - LEN3 | 用來表明相應斷點地址寄存器內存位置的大小 |
R/W0 - R/W3 | 相應斷點的狀態 |
-
系統地址寄存器(4個):GDTR、IDTR、LDTR和TR
GDTR:全局描述符表寄存器,是一個48位寄存器,用來存放全局描述符表GDT的32位線性基地址和16位的界限值。在全局描述符表中不僅包括有操作系統使用的描述符,而且還有所有任務使用的公用描述符。
IDTR:中斷描述符表寄存器,是一個48位寄存器,用來存放中斷描述符表IDT的32位線性基地址和16位的界限值。
LDTR:局部描述符表寄存器,是一個16位寄存器,用來存放局部描述符表LDT的16位選擇符。另外還有一個隱含的描述符高速緩沖寄存器,用來存放LDT表描述符。
TR:任務狀態寄存器,是一個16位寄存器,用來存放任務狀態段TSS的16位選擇符。與之相應,也有一個隱含的描述符高速緩沖寄存器,用來存放任務狀態段TSS的描述符。
-
16位段寄存器(6個):CS、DS、ES、FS、GS、SS
段寄存器有兩部分,一部分是編程可見的選擇器寄存器,為6個16位寄存器,對應在另一部分有6個64位的描述符寄存器,后一部分是編程不可見的。
在實地址方式或虛擬8086方式,描述符寄存器不起作用,選擇器寄存器退化成16位CPU的段寄存器功能,存放內存段的段基址——段首地址的高16位,其中CS對應於代碼段、SS對應於堆棧段,DS對應於數據段,ES對應於附加數據段,在串操作時,DS和ES分別對應於源數據段和目的數據段。FS和GS沒有定義。
-
其他寄存器:EIP、TSC等
-
指令指針指示器--EIP
32位寄存器,低16位稱為IP,用與兼容16位CPU,其內容是下一條要取入CPU的指令在內存中的偏移地址。當一個程序開始運行時,系統把EIP清零,每取入一條指令,EPI自動增加取入CPU的字節數目。所以稱EIP為指令指針。
-
時間戳寄存器--TSC
每個時鍾周期時其值加1,重啟時清零。通過RDTSC指令讀取TSC寄存器,只有當CR4寄存器的TSD位為0時,才可以在任何優先級下執行該指令,否則只能在特權級下執行該指令。
-
浮點寄存器
由於在80486微處理器內部設有浮點運算器,因此在其內部有相應的寄存器,其中包括8個80位通用數據寄存器、1個48位指令指針寄存器、1個48位數據指針寄存器、1個16位控制字寄存器、1個16位狀態字寄存器和1個16位標記字寄存器。
-
主要技術
重命名技術:寄存器重命名,是CPU在解碼過程中對寄存器進行重命名,解碼器把“其它”的寄存器名字變為“通用”的寄存器名字,本質上是通過一個表格把x86寄存器重新映射到其它寄存器,這樣可以讓實際使用到的寄存器遠大於8個。這樣做的好處除了便於前面指令發生意外或分支預測出錯時取消外,還避免了由於兩條指令寫同一個寄存器時的等待。
亂序執行技術:采用亂序執行技術使CPU內部電路滿負荷運轉並相應提高了CPU運行程序的速度。類似多個CPU同步執行。
特點
寄存器又分為內部寄存器與外部寄存器,所謂內部寄存器,其實也是一些小的存儲單元,也能存儲數據。但同存儲器相比,寄存器又有自己獨有的特點:
-
寄存器位於CPU內部,數量很少,僅十四個
-
寄存器所能存儲的數據位數根據處理器類型不同而不同(8bit、16bit及32bit)
-
每個內部寄存器都有一個名字,而沒有類似存儲器的地址編號
參考資料