1. 程式人生 > >【彙編】各個暫存器作用詳解

【彙編】各個暫存器作用詳解

  英文名稱:Register

暫存器定義

  暫存器是中央處理器內的組成部份。暫存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、資料和位址。在中央處理器的控制部件中,包含的暫存器有指令暫存器(IR)和程式計數器(PC)。在中央處理器的算術及邏輯部件中,包含的暫存器有累加器(ACC)。
  暫存器是記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。暫存器通常都是以他們可以儲存的位元數量來估量,舉例來說,一個 “8 位元暫存器”或 “32 位元暫存器”。暫存器現在都以暫存器檔案的方式來實作,但是他們也可能使用單獨的正反器、高速的核心記憶體、薄膜記憶體以及在數種機器上的其他方式來實作出來。 
  暫存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為 “架構暫存器”。 
  例如,x86 指令及定義八個 32 位元暫存器的集合,但一個實作 x86 指令集的 CPU 可以包含比八個更多的暫存器。
  暫存器是CPU內部的元件,暫存器擁有非常高的讀寫速度,所以在暫存器之間的資料傳送非常快。

暫存器用途

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

資料暫存器

  8086 有14個16位暫存器,這14個暫存器按其用途可分為(1)通用暫存器、(2)指令指標、(3)標誌暫存器和(4)段暫存器等4類。
  (1)通用暫存器有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位進行存取操作,主要用來形成運算元的地址,用於堆疊操作和變址運算中計算運算元的有效地址。
  (2) 指令指標IP(Instruction Pointer)
  指令指標IP是一個16位專用暫存器,它指向當前需要取出的指令位元組,當BIU從記憶體中取出一個指令位元組後,IP就自動加1,指向下一個指令位元組。注意,IP指向的是指令地址的段內地址偏移量,又稱偏移地址(Offset Address)或有效地址(EA,Effective Address)。
  (3)標誌暫存器FR(Flag Register)
  
8086有一個18位的標誌暫存器FR,在FR中有意義的有9位,其中6位是狀態位,3位是控制位。
  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。 
  ZF: 零標誌ZF用來反映運算結果是否為0。如果運算結果為0,則其值為1,否則其值為0。在判斷運算結果是否為0時,可使用此標誌位。 
  AF:下列情況下,輔助進位標誌AF的值被置為1,否則其值為0: 
  (1)、在字操作時,發生低位元組向高位元組進位或借位時; 
  (2)、在位元組操作時,發生低4位向高4位進位或借位時。 
  PF:奇偶標誌PF用於反映運算結果中“1”的個數的奇偶性。如果“1”的個數為偶數,則PF的值為1,否則其值為0。 
  CF:進位標誌CF主要用來反映運算是否產生進位或借位。如果運算結果的最高位產生了一個進位或借位,那麼,其值為1,否則其值為0。) 
  4)段暫存器(Segment Register)
  為了運用所有的記憶體空間,8086設定了四個段暫存器,專門用來儲存段地址:
  CS(Code Segment):程式碼段暫存器;
  DS(Data Segment):資料段暫存器;
  SS(Stack Segment):堆疊段暫存器;
  ES(Extra Segment):附加段暫存器。
  當一個程式要執行時,就要決定程式程式碼、資料和堆疊各要用到記憶體的哪些位置,通過設定段暫存器 CS,DS,SS 來指向這些起始位置。通常是將DS固定,而根據需要修改CS。所以,程式可以在可定址空間小於64K的情況下被寫成任意大小。 所以,程式和其資料組合起來的大小,限制在DS 所指的64K內,這就是COM檔案不得大於64K的原因。8086以記憶體做為戰場,用暫存器做為軍事基地,以加速工作。
  以上是8086暫存器的整體概況, 自80386開始,PC進入32bit時代,其定址方式,暫存器大小, 功能等都發生了變化:
  =============================以下是80386的暫存器的一些資料======================================
  暫存器都是32-bits寬。
  A、通用暫存器 
  下面介紹通用暫存器及其習慣用法。顧名思義,通用暫存器是那些你可以根據自己的意願使用的暫存器,修改他們的值通常不會對計算機的執行造成很大的影響。通用暫存器最多的用途是計算。 
  EAX:通用暫存器。相對其他暫存器,在進行運算方面比較常用。在保護模式中,也可以作為記憶體偏移指標(此時,DS作為段 暫存器或選擇器) 
  EBX:通用暫存器。通常作為記憶體偏移指標使用(相對於EAX、ECX、EDX),DS是預設的段暫存器或選擇器。在保護模式中,同樣可以起這個作用。 
  ECX:通用暫存器。通常用於特定指令的計數。在保護模式中,也可以作為記憶體偏移指標(此時,DS作為 暫存器或段選擇器)。
  EDX:通用暫存器。在某些運算中作為EAX的溢位暫存器(例如乘、除)。在保護模式中,也可以作為記憶體偏移指標(此時,DS作為段 暫存器或選擇器)。 
  同AX分為AH&AL一樣,上述暫存器包括對應的16-bit分組和8-bit分組。 
  B、用作記憶體指標的特殊暫存器
  ESI:通常在記憶體操作指令中作為“源地址指標”使用。當然,ESI可以被裝入任意的數值,但通常沒有人把它當作通用暫存器來用。DS是預設段暫存器或選擇器。 
  EDI:通常在記憶體操作指令中作為“目的地址指標”使用。當然,EDI也可以被裝入任意的數值,但通常沒有人把它當作通用暫存器來用。DS是預設段暫存器或選擇器。 
  EBP:這也是一個作為指標的暫存器。通常,它被高階語言編譯器用以建造‘堆疊幀'來儲存函式或過程的區域性變數,不過,還是那句話,你可以在其中儲存你希望的任何資料。SS是它的預設段暫存器或選擇器。 
  注意,這三個暫存器沒有對應的8-bit分組。換言之,你可以通過SI、DI、BP作為別名訪問他們的低16位,卻沒有辦法直接訪問他們的低8位。 
  C、段選擇器:
  真實模式下的段暫存器到保護模式下搖身一變就成了選擇器。不同的是,真實模式下的“段暫存器”是16-bit的,而保護模式下的選擇器是32-bit的。 
  CS 程式碼段,或程式碼選擇器。同IP暫存器(稍後介紹)一同指向當前正在執行的那個地址。處理器執行時從這個暫存器指向的段(真實模式)或記憶體(保護模式)中獲取指令。除了跳轉或其他分支指令之外,你無法修改這個暫存器的內容。 
  DS 資料段,或資料選擇器。這個暫存器的低16 bit連同ESI一同指向的指令將要處理的記憶體。同時,所有的記憶體操作指令 預設情況下都用它指定操作段(真實模式)或記憶體(作為選擇器,在保護模式。這個暫存器可以被裝入任意數值,然而在這麼做的時候需要小心一些。方法是,首先把資料送給AX,然後再把它從AX傳送給DS(當然,也可以通過堆疊來做). 
  ES 附加段,或附加選擇器。這個暫存器的低16 bit連同EDI一同指向的指令將要處理的記憶體。同樣的,這個暫存器可以被裝入任意數值,方法和DS類似。 
  FS F段或F選擇器(推測F可能是Free?)。可以用這個暫存器作為預設段暫存器或選擇器的一個替代品。它可以被裝入任何數值,方法和DS類似。 
  GS G段或G選擇器(G的意義和F一樣,沒有在Intel的文件中解釋)。它和FS幾乎完全一樣。 
  SS 堆疊段或堆疊選擇器。這個暫存器的低16 bit連同ESP一同指向下一次堆疊操作(push和pop)所要使用的堆疊地址。這個暫存器也可以被裝入任意數值,你可以通過入棧和出棧操作來給他賦值,不過由於堆疊對於很多操作有很重要的意義,因此,不正確的修改有可能造成對堆疊的破壞。 
  * 注意 一定不要在初學彙編的階段把這些暫存器弄混。他們非常重要,而一旦你掌握了他們,你就可以對他們做任意的操作了。段暫存器,或選擇器,在沒有指定的情況下都是使用預設的那個。這句話在現在看來可能有點稀裡糊塗,不過你很快就會在後面知道如何去做。 
  指令指標暫存器:
  EIP 這個暫存器非常的重要。這是一個32位寬的暫存器 ,同CS一同指向即將執行的那條指令的地址。不能夠直接修改這個暫存器的值,修改它的唯一方法是跳轉或分支指令。(CS是預設的段或選擇器) 
  上面是最基本的暫存器。下面是一些其他的暫存器,你甚至可能沒有聽說過它們。(都是32位寬):
  CR0, CR2, CR3(控制暫存器)。舉一個例子,CR0的作用是切換真實模式和保護模式。 
  還有其他一些暫存器,D0, D1, D2, D3, D6和D7(除錯暫存器)。他們可以作為偵錯程式的硬體支援來設定條件斷點。 
  TR3, TR4, TR5, TR6 和 TR? 暫存器(測試暫存器)用於某些條件測試