暫存器

暫存器

暫存器是中央處理器內的組成部分。暫存器是有限存貯容量的高速存貯部件,它們可用來暫存指令數據地址。在中央處理器的控制部件中,包含的暫存器有指令暫存器(IR)和程式計數器(PC)。在中央處理器的算術及邏輯部件中,暫存器有累加器(ACC)。

基本介紹

  • 中文名:暫存器
  • 外文名:Register
  • 定義:有限存貯容量的高速存貯部件
  • 分類:指令暫存器(IR) 程式計數器(PC)
基本含義,分類,原理,8086暫存器,通用暫存器,指令指針IP,標誌暫存器,段暫存器,工作原理,主要技術,重命名技術,亂序執行技術,特點,用途,具體舉例,UxCTL,通用暫存器,特殊暫存器,段選擇器,指令指針,其他暫存器,

基本含義

暫存器,是積體電路中非常重要的一種存儲單元,通常由觸發器組成。在積體電路設計中,暫存器可分為電路內部使用的暫存器和充當內外部接口的暫存器這兩類。內部暫存器不能被外部電路或軟體訪問,只是為內部電路的實現存儲功能或滿足電路的時序要求。而接口暫存器可以同時被內部電路和外部電路或軟體訪問,CPU中的暫存器就是其中一種,作為軟硬體的接口,為廣泛的通用編程用戶所熟知。
在計算機領域,暫存器是CPU內部的元件,包括通用暫存器、專用暫存器和控制暫存器。暫存器擁有非常高的讀寫速度,所以在暫存器之間的數據傳送非常快。
暫存器記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。暫存器通常都是以他們可以保存的位元數量來估量,
舉例來說,一個“8 位元暫存器”或“32元暫存器”。暫存器現在都以暫存器檔案的方式來實作,但是他們也可能使用單獨的正反器、高速的核心記憶體、薄膜記憶體以及在數種機器上的其他方式來實作出來。
暫存器暫存器
暫存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為“架構暫存器”。
例如,x86指令集定義八個32 位元暫存器的集合,但一個實際 x86 指令集的CPU可以包含比八個更多的暫存器。

分類

數據暫存器- 用來儲存整數數字(參考以下的浮點暫存器)。在某些簡單/舊的CPU,特別的數據暫存器是累加器,作為數學計算之用。
暫存器暫存器
地址暫存器- 持有存儲器地址,用來訪問存儲器。在某些簡單/舊的CPU里,特別的地址暫存器是索引暫存器(可能出現一個或多個)。
通用目的暫存器(GPRs) - 可以保存數據或地址兩者,也就是說它們是結合數據/地址 暫存器的功用。
浮點暫存器(FPRs) - 用來儲存浮點數字
常數暫存器- 用來持有隻讀的數值(例如0、1、圓周率等等)。
向量暫存器- 用來儲存由向量處理器運行SIMD(Single Instruction, Multiple Data)指令所得到的數據。
特殊目的暫存器- 儲存CPU內部的數據,像是程式計數器(或稱為指令指針),堆疊暫存器,以及狀態暫存器(或稱微處理器狀態字組)。
指令暫存器(instruction register)- 儲存現在正在被運行的指令。
索引暫存器(index register)- 是在程式運行時用來更改運算對象地址之用。
在某些架構下,模式指示暫存器(也稱為“機器指示暫存器”)儲存和設定跟處理器自己有關的數據。由於他們的意圖目的是附加到特定處理器的設計,因此他們並不被預期會成為微處理器世代之間保留的標準。
PORT1的控制暫存器PORT1的控制暫存器
有關從隨機存取存儲器提取信息的暫存器與CPU(位於不同晶片的儲存暫存器集合)
存儲器緩衝暫存器(Memory buffer register)
存儲器數據暫存器(Memory data register)
存儲器地址暫存器(Memory address register)
存儲器型態範圍暫存器(Memory Type Range Registers)
向量暫存器

原理

暫存器的基本單元是 D觸發器,按照其用途分為基本暫存器和移位暫存器
基本暫存器邏輯圖基本暫存器邏輯圖
基本暫存器(見圖)是由 D觸發器組成,在 CP 脈衝作用下,每個 D觸發器能夠暫存一位二進制碼。在 D=0 時,暫存器儲存為 0,在 D=1 時,暫存器儲存為 1。
在低電平為 0、高電平為 1 時,需將信號源與 D 間連線一反相器,這樣就可以完成對數據的儲存。
需要強調的是,目前大型數字系統都是基於時鐘運作的,其中暫存器一般是在時鐘的邊緣被觸發的,基於電平觸發的已較少使用。(通常說的CPU的頻率就是指數字積體電路的時鐘頻率)
移位暫存器按照移位方向可以分為單向移位暫存器和雙向移位暫存器
單向移位暫存器是由多個 D 觸發器串接而成(見圖),在串口 Di 輸入需要儲存的數據,觸發器 FF0 就能夠儲存當前需要儲存數據,在 CP 發出一次時鐘控制脈衝時,串口 Di 同時輸入第二個需要儲存是的數據,而第一個數據則儲存到觸發器 FF1 中。
暫存器
雙向移位暫存器按圖中方式排列,調換連線端順序,可以控制暫存器向左移位,增加控制電路可以使暫存器右移,這樣構成雙向移位暫存器。

8086暫存器

8086 有14個16位暫存器,這14個暫存器按其用途可分為(1)通用暫存器、(2)指令指針、(3)標誌暫存器和(4)段暫存器等4類。

通用暫存器

有8個, 又可以分成2組,一組是數據暫存器(4個),另一組是指針暫存器及變址暫存器(4個).
暫存器
顧名思義,通用暫存器是那些你可以根據自己的意願使用的暫存器,修改他們的值通常不會對計算機的運行造成很大的影響。
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位進行存取操作,主要用來形成運算元的地址,用於堆疊操作和變址運算中計算運算元的有效地址

指令指針IP

指令指針IP是一個16位專用暫存器,它指向當前需要取出的指令位元組,當BIU從記憶體中取出一個指令位元組後,IP就自動加(取出該位元組的長度,如:BIU從記憶體中取出的是1個位元組,IP就會自動加1,如果BIU從記憶體中取出的位元組數長度為3,IP就自動加3),指向下一個指令位元組。注意,IP指向的是指令地址的段內地址偏移量,又稱偏移地址(Offset Address)或有效地址(EA,Effective Address)。

標誌暫存器

8086有一個16位的標誌性暫存器FR,在FR中有意義的有9位,其中6位是狀態位,3位是控制位。標誌暫存器(Flags Register,FR)又稱程式狀態字(Program Status Word,PSW)。這是一個存放條件標誌、控制標誌暫存器,主要用於反映處理器的狀態和運算結果的某些特徵及控制指令的執行。
標誌暫存器位置圖:
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
OF
DF
IF
TF
SF
ZF
AF
PF
CF
OF:溢出標誌位OF用於反映有符號數加減運算所得結果是否溢出。如果運算結果超過當前運算位數所能表示的範圍,則稱為溢出,OF的值被置為1,否則,OF的值被清為0。
DF:方向標誌DF位用來決定在串操作指令執行時有關指針暫存器發生調整的方向。
IF:中斷允許標誌IF位用來決定CPU是否回響CPU外部的可禁止中斷發出的中斷請求。但不管該標誌為何值,CPU都必須回響CPU外部的不可禁止中斷所發出的中斷請求,以及CPU內部產生的中斷請求。具體規定如下:
(1)、當IF=1時,CPU可以回響CPU外部的可禁止中斷發出的中斷請求
(2)、當IF=0時,CPU不回響CPU外部的可禁止中斷發出的中斷請求。
TF:跟蹤標誌TF。該標誌可用於程式調試。TF標誌沒有專門的指令來設定或清除。
(1)如果TF=1,則CPU處於單步執行指令的工作方式,此時每執行完一條指令,就顯示CPU內各個暫存器的當前值及CPU將要執行的下一條指令。
(2)如果TF=0,則處於連續工作模式。
SF:符號標誌SF用來反映運算結果的符號位,它與運算結果的最高位相同。在微機系統中,有符號數採用補碼錶示法,所以,SF也就反映運算結果的正負號。運算結果為非負數時,SF的值為0,否則其值為1。當運算結果沒有產生溢出時,運算結果等於邏輯結果(即應該得到的正確的結果),此時SF表示的是邏輯結果的正負,當運算結果產生溢出時,運算結果不等於邏輯結果,此時的SF值所表示的正負情況與邏輯結果相反,即:SF=0時,邏輯結果為負,SF=1時,邏輯結果為非負。
ZF:零標誌ZF用來反映運算結果是否為0。如果運算結果為0,則其值為1,否則其值為0。在判斷運算結果是否為0時,可使用此標誌位。
暫存器暫存器
AF:( Assistant Carry Flag)下列情況下,輔助進位標誌AF的值被置為1,否則其值為0:
(1)、在字操作時,發生低位元組向高位元組進位或借位時
(2)、在位元組操作時,發生低4位向高4位進位或借位時。
PF:奇偶標誌PF用於反映運算結果中“1”的個數的奇偶性。如果“1”的個數為偶數,則PF的值為1,否則其值為0。
CF:進位標誌CF主要用來反映無符號數運算是否產生進位或借位。如果運算結果的最高位產生了一個進位或借位,那么,其值為1,否則其值為0。

段暫存器

為了運用所有的記憶體空間,8086設定了四個段暫存器,專門用來保存段地址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以上的地址找不到。

工作原理

暫存器的功能十分重要,CPU對存儲器中的數據進行處理時,往往先把數據取到內部暫存器中,而後再作處理。外部暫存器是計算機中其它一些部件上用於暫存數據的暫存器,它與CPU之間通過“連線埠”交換數據,外部暫存器具有暫存器和記憶體儲器雙重特點。有些時候我們常把外部暫存器就稱為“連線埠”,這種說法不太嚴格,但經常這樣說。
外部暫存器雖然也用於存放數據,但是它保存的數據具有特殊的用途。某些暫存器中各個位的0、1狀態反映了外部設備的工作狀態或方式;還有一些暫存器中的各個位可對外部設備進行控制;也有一些連線埠作為CPU同外部設備交換數據的通路。所以說,連線埠是CPU和外設間的聯繫橋樑。CPU對連線埠的訪問也是依據連線埠的“編號”(地址),這一點又和訪問存儲器一樣。不過考慮到機器所聯接的外設數量並不多,所以在設計機器的時候僅安排了1024個連線埠地址,連線埠地址範圍為0--3FFH。

主要技術

重命名技術

暫存器重命名,是CPU在解碼過程中對暫存器進行重命名,解碼器把“其它”的暫存器名字變為“通用”的暫存器名字,本質上是通過一個表格把x86暫存器重新映射到其它暫存器,這樣可以讓實際使用到的暫存器遠大於8個。這樣做的好處除了便於前面指令發生意外或分支預測出錯時取消外,還避免了由於兩條指令寫同一個暫存器時的等待。

亂序執行技術

採用亂序執行技術使CPU內部電路滿負荷運轉並相應提高了CPU運行程式的速度。這好比請A、B、C三個名人為春節聯歡晚會題寫橫幅“春節聯歡晚會”六個大字,每人各寫兩個字,如果這時在一張大紙上按順序由A寫好“春節”後再交給B寫“聯歡”,然後再由C寫“晚會”,那么這樣在A寫的時候,B和C必須等待,而在B寫的時候C仍然要等待而A已經沒事了。
但如果採用三個人分別用三張紙同時寫的做法,那么B和C都不必等待就可以同時各寫各的了,甚至C和B還可以比A先寫好 也沒關係(就像亂序執行),但當他們都寫完後就必須重新在橫幅上按“春節聯歡晚會”的順序排好(自然可以由別人做,就象CPU中亂序執行後的重新排列單元)才能掛出去。

特點

暫存器又分為內部暫存器與外部暫存器,所謂暫存器,其實也是一些小的存儲單元,也能存儲數據。但同存儲器相比,暫存器又有自己獨有的特點:
暫存器位於CPU內部,數量很少,僅十四個
②暫存器所能存儲的數據不一定是8bit,有一些暫存器可以存儲16bit數據,對於386/486處理器中的一些暫存器則能存儲32bit數據
③每個內部暫存器都有一個名字,而沒有類似存儲器的地址編號。

用途

1.可將暫存器內的數據執行算術及邏輯運算
2.存於暫存器內的地址可用來指向記憶體的某個位置,即定址
3.可以用來讀寫數據到電腦的周邊設備。

具體舉例

UxCTL

UxCTL暫存器是一個8位的暫存器。UASRT模組的基本操作由該暫存器的控制位確定的,它包含了通信協定、通信模式和校驗位等的選擇。圖給出了暫存器的各個位。
圖
圖UxCTL暫存器
由圖可以看出,UxCTL暫存器主要包括8個有效的控制位。為了增加對UxCTL暫存器的了解,知道怎樣對該暫存器進行正確的設定,下面對UxCTL暫存器的各個位進行詳細介紹。
PENA:校驗使能位。當該位為0時,不允許校驗;當該位為1時,允許校驗。如果允許校驗,則傳送時產生校驗位,在接收時希望接收到校驗位。.當在地址位多機模式中¨地址位包括在校驗計算中。
PEV:奇偶校驗位。當該位為0時,進行奇校驗;當該位為1時,進行偶校驗
SPB:停止位。該位用來選擇傳送時停止位的個數,但接收時停止位只有一個。當該位為0時,傳送時只有1個停止位;當該位為1時,傳送時有2個停止位。
CHAR:字元長度位。該位用來選擇傳送時數據的長度。當該位為0時,傳送的數據為7位;當該位為1時,傳送的數據為8位。
LISTEN:監聽使能位。該位用來選擇反饋模式。當該位為0時,沒有反饋;當該位為1時,有反饋,傳送的數據被送到接收器,這樣可以進行自環測試。
SYNC:該位用於同步模式選擇和異步模式選擇。當該位為0時,USART模組為異步通信(UART)模式;當該位為1時,USART模組為同步通信(SPI)模式。
MM:多機模式選擇位。當該位為0時,多機模式選擇線路空閒多機協定;當該位為1時,多機模式選擇地址位多機協定。
SWRST:軟體復位使能位。當該位為0時,UASRT模組被允許;當該位為1時,UASRT模組被禁止。
通過以上對UxCTL暫存器的各個位的介紹,可以完成對通信模式和通信數據格式等的選擇。

通用暫存器

顧名思義,通用暫存器是那些你可以根據自己的意願使用的暫存器,修改他們的值通常不會對計算機的運行造成很大的影響。通用暫存器最多的用途是計算。
通用暫存器通用暫存器
EAX:通用暫存器。相對其他暫存器,在進行運算方面比較常用。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為段暫存器或選擇器)
EBX:通用暫存器。通常作為記憶體偏移指針使用(相對於EAX、ECX、EDX),DS是默認的段暫存器或選擇器。在保護模式中,同樣可以起這個作用。
ECX:通用暫存器。通常用於特定指令的計數。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為暫存器或段選擇器)。
EDX:通用暫存器。在某些運算中作為EAX的溢出暫存器(例如乘、除)。
同AX分為AH&AL一樣,上述暫存器包括對應的16-bit分組和8-bit分組。

特殊暫存器

ESI:通常在記憶體操作指令中作為“源地址指針”使用。當然,ESI可以被裝入任意的數值,但通常沒有人把它當作通用暫存器來用。DS是默認段暫存器或選擇器。
現金暫存器現金暫存器
EDI:通常在記憶體操作指令中作為“目的地址指針”使用。當然,EDI也可以被裝入任意的數值,但通常沒有人把它當作通用暫存器來用。ES是默認段暫存器或選擇器。
EBP和ESP:作為指針的暫存器,也可作為16位暫存器BP, SP使用,常用於椎棧操作。通常,它被高級語言編譯器用以建造‘堆疊幀'來保存函式或過程的局部變數,不過,還是那句話,你可以在其中保存你希望的任何數據。SS是它的默認段暫存器或選擇器。
注意,這四個暫存器沒有對應的8-bit分組。換言之,你可以通過SI、DI、BP、SP作為別名訪問他們的低16位,卻沒有辦法直接訪問他們的低8位。

段選擇器

實模式下的段暫存器到保護模式下搖身一變就成了選擇器。不同的是,實模式下的“段暫存器”是16-bit的,而保護模式下的選擇器是32-bit的。
CS代碼段,或代碼選擇器。同IP暫存器(稍後介紹)一同指向當前正在執行的那個地址。處理器執行時從這個暫存器指向的段(實模式)或記憶體(保護模式)中獲取指令。除了跳轉或其他分支指令之外,你無法修改這個暫存器的內容。
DS數據段,或數據選擇器。這個暫存器的低16 bit連同ESI一同指向的指令將要處理的記憶體。同時,所有的記憶體操作指令默認情況下都用它指定操作段(實模式)或記憶體(作為選擇器,在保護模式。這個暫存器可以被裝入任意數值,然而在這么做的時候需要小心一些。方法是,首先把數據送給AX,然後再把它從AX傳送給DS(當然,也可以通過堆疊來做).
ES 附加段,或附加選擇器。這個暫存器的低16 bit連同EDI一同指向的指令將要處理的記憶體。同樣的,這個暫存器可以被裝入任意數值,方法和DS類似。
FS F段或F選擇器(推測F和下面的G正好是上面CS,DS,ES的字母順延)。可以用這個暫存器作為默認段暫存器或選擇器的一個替代品。它可以被裝入任何數值,方法和DS類似。
GS G段或G選擇器(G的意義和F一樣,沒有在Intel的文檔中解釋)。它和FS幾乎完全一樣。
SS堆疊段或堆疊選擇器。這個暫存器的低16 bit連同ESP一同指向下一次堆疊操作(push和pop)所要使用的堆疊地址。這個暫存器也可以被裝入任意數值,你可以通過入棧和出棧操作來給他賦值,不過由於堆疊對於很多操作有很重要的意義,因此,不正確的修改有可能造成對堆疊的破壞。
* 注意一定不要在初學彙編的階段把這些暫存器弄混。他們非常重要,而一旦你掌握了他們,你就可以對他們做任意的操作了。段暫存器,或選擇器,在沒有指定的情況下都是使用默認的那個。這句話在現在看來可能有點稀里糊塗,不過你很快就會在後面知道如何去做。

指令指針

EIP 這個暫存器非常的重要。這是一個32位寬暫存器,同CS一同指向即將執行的那條指令的地址,存放指令的偏移地址微處理器工作於實模式下,EIP是IP(16位)暫存器。不能夠直接修改這個暫存器的值,修改它的唯一方法是跳轉或分支指令。(CS是默認的段或選擇器)
EFR(extra flags register)包括控制系統標誌,用於指示微處理器的狀態並控制微處理器的操作。80486 CPU標誌暫存器如圖2.12所示。
狀態標誌位:包括進位標誌CF、奇偶標誌PF輔助進位標誌AF、零標誌ZF 、符號標誌SF和溢出標誌OF。
② 控制標誌位:包括陷阱標誌(單步操作標誌)TF、中斷標誌IF和方向標誌DF。80486 CPU標誌暫存器中的狀態標誌位和控制標誌位與8086 CPU標誌暫存器中的狀態標誌位和控制標誌位的功能完全一樣,這裡就不再贅述。
③ 系統標誌位和IOPL欄位:在EFR暫存器中的系統標誌和IOPL欄位,用於控制作業系統或執行某種操作。它們不能被應用程式修改。
IOPL(I/O privilege level field):輸入/輸出特權級標誌位。它規定了能使用I/O敏感指令特權級。在保護模式下,利用這兩位編碼可以分別表示0, 1, 2, 3這四種特權級,0級特權最高,3級特權最低。在80286以上的處理器中有一些I/O敏感指令,如CLI(關中斷指令)、STI(開中斷指令)、IN(輸入)、OUT(輸出)。IOPL的值規定了能執行這些指令的特權級。只有特權高於IOPL的程式才能執行I/O敏感指令,而特權低於IOPL的程式,若企圖執行敏感指令,則會引起異常中斷。
NT(nested task flag):任務嵌套標誌。在保護模式下,指示當前執行的任務嵌套於另一任務中。當任務被嵌套時,NT=1,否則NT=0。
RF(resume flag):恢復標誌。與調試暫存器一起使用,用於保證不重複處理斷點。當RF=1時,即使遇到斷點或故障,也不產生異常中斷。
VM(virtual 8086 mode flag):虛擬8086模式標誌。用於在保護模式系統中選擇虛擬操作模式。VM=1,啟用虛擬8086模式;VM=0,返回保護模式。
AC(alignment check flag):佇列檢查標誌。如果在不是字或雙字的邊界上定址一個字或雙字,佇列檢查標誌將被激活。

其他暫存器

上面是最基本的暫存器。下面是一些其他的暫存器,你甚至可能沒有聽說過它們。(都是32位寬):
CR0, CR2, CR3(控制暫存器)。舉一個例子,CR0的作用是切換實模式和保護模式。
還有其他一些暫存器,D0, D1, D2, D3, D6和D7(調試暫存器)。他們可以作為調試器的硬體支持來設定條件斷點。
TR3, TR4, TR5, TR6 和TR?暫存器(測試暫存器)用於某些條件測試。

相關詞條

熱門詞條

聯絡我們