html
寄存器是集成電路中很是重要的一種存儲單元,一般由D觸發器組成。在集成電路設計中,寄存器可分爲電路內部使用的寄存器和充當內外部接口的寄存器這兩類。內部寄存器不能被外部電路或軟件訪問,只是爲內部電路的實現存儲功能或知足電路的時序要求。而接口寄存器能夠同時被內部電路和外部電路或軟件訪問,CPU中的寄存器就是其中一種,做爲軟硬件的接口,爲普遍的通用編程用戶所熟知。編程
寄存器擁有很是高的讀寫速度,因此在寄存器之間的數據傳送很是快。寄存器是內存階層中的最頂端,也是系統得到操做資料的最快速途徑。寄存器一般都是以他們能夠保存的位元數量來估量,舉例來講,一個「8位元寄存器」或「32位元寄存器」。緩存
以8086(16位處理器,14個寄存器)爲例。按其用途可分爲:數據結構
通用寄存器(8個):oop
數據寄存器性能
AH&AL=AX(accumulator):累加寄存器,經常使用於運算;在乘除等指令中指定用來存放操做數,另外,全部的I/O指令都使用這一寄存器與外界設備傳送數據。測試
BH&BL=BX(base):基址寄存器,經常使用於地址索引。ui
CH&CL=CX(count):計數寄存器,經常使用於計數,經常使用於保存計算值。如在移位指令,循環(loop)和串處理指令中用做隱含的計數器。this
DH&DL=DX(data):數據寄存器,經常使用於數據傳遞。spa
這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):數據段寄存器
當一個程序要執行時,就要決定程序代碼、數據和堆棧各要用到內存的哪些位置,經過設定段寄存器CS,DS,SS來指向這些起始位置。一般是將DS固定,而根據須要修改CS。因此,程序能夠在可尋 址空間小於64K的狀況下被寫成任意大小。因此,程序和其數據組合起來的大小,限制在DS所指的64K內,這就是COM文件不得大於64K的緣由。8086之內存做爲戰場,用寄存器作爲軍事基地,以加速工做。
備註:因爲所講的是16位cpu,IP寄存器的位數爲16,即:偏移地址爲16位,2的16次冪就是64K,因此16位段地址不能超過64K,超過64K會形成64K以上的地址找不到。
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指令的支持。 |
控制寄存器決定處理器的操做模式和當前執行任務的一些特徵。
標誌 | 描述 |
---|---|
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,不使用分頁機制。 |
標誌 | 描述 |
---|---|
PWT(Page-Level Writethrough) | 控制cache採起直寫仍是回寫的策略。當設置清空時,回寫有效。當置位時,直寫有效 |
PCD(Page-Level Cache Disable) | PCD=1,表示最高目錄表不可緩存,PCD=0,相反 |
標誌 | 描述 |
---|---|
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)
每一個內部寄存器都有一個名字,而沒有相似存儲器的地址編號