天天看點

加殼學習筆記(一)-基礎知識

1.預備知識

  1.關于棧,在windows裡面的堆棧其實很簡單,當學了才知道哈,呵呵,第一要記住的是windows裡面的棧是向低位址生長的(extended,延伸,呵呵,順便豐富下英語的單詞量,确實是少的可憐),你可以這樣認為,棧就像是一個倒立的箱子,箱子的口子是向下的,底是向上的,這裡就表明了系統棧的分布也是延伸方向是由高位址向低位址extended,在最初的空棧階段,棧頂(extended stack pointer,簡稱是esp)在棧底的低一個位置,呵呵,其實很好了解,就是說最初的箱子是空的嘛,并且箱子頂緊貼着箱子底,很空洞的樣子,呵呵,但是随着入棧(push,又叫壓棧)的發生,棧頂的位址在不斷的縮小,直到達到棧的大小為止(這裡解釋一下,在window裡,一個棧幀的大小是固定的,有的人說是1M,有的人說是2M,這裡我可不想糾結這個,一句話,你生成了一個棧,棧的最大值是固定了的,當一個棧裡壓入的資料過多時,就會提示

overflow,棧溢出,一般的棧的申請是成功的,因為當你去系統記憶體申請棧空間的時候,隻要系統的空閑記憶體大于你申請的記憶體大小,都會配置設定棧空間給你,否則就是配置設定失敗,)正式一點的說法就是:棧就像是一個在記憶體裡申請的一塊連續的空間,由高位址向低位址生長的,在棧的配置設定方式上就決定了棧的空間必須是完整的,就是說像豆腐一樣必須是整塊的,如果沒有整塊的空間就構不成棧哈,這樣就造成了棧自創造之日起就具有了他的優缺點,優點是:在記憶體裡連續,不需要内部指針的尋址,周遊速度快;缺點是:棧的空間的完整性就決定了他不能利用小的空間,這樣就造成了記憶體碎片的産生。

  2.關于堆,其實對于堆,直接相對于棧說就行了,呵呵,堆是在系統的虛拟記憶體裡配置設定的,是以堆的大小是很靈活的,就是說隻要虛拟記憶體夠大,再加上CPU尋址可以達到,那堆的空間就要多大有多大,在32位機子裡的最大尋址還是4G,是以32位系統的最大堆記憶體可達到4G哈,在windows裡面的堆生長正好和棧是反着的,就是說在記憶體位址上是由低位址向高位址增加的,一般的堆是比較靈活,因為他的配置設定是以連結清單的模式配置設定的,具體過程是當程式員要new一個堆了,系統首先去一個連結清單裡找位址(這裡解釋一下哈,系統把所有的空閑記憶體區域的位址存放在一個連結清單裡,實際就是一個記憶體目錄啊,好比旅館裡的登記簿,裡面可以查到哪裡有人住,哪裡沒人住)當他找到有一塊空閑位址的大小大于你要申請的空間大小時,就會把該節點在連結清單裡删掉,把該區域的位址傳回給new函數,是以new函數是有傳回值的,并且是指針類型的,要用指針類型的指針接收,寫到這裡心潮澎湃,豁然開朗啊,以前還以為是直接到記憶體裡去找空間那,呵呵,其實早該想到,系統沒有這麼傻,隻要記錄下這裡資源的利用情況不就行了嘛,并且這樣的複用性還是很高的,做到了記憶體管理的統一,并且各種簡明啊,配置設定完成後記得要free(指向對記憶體的位址指針)h或者升點級用delete(也是指向對記憶體的位址指針),不然要造成記憶體洩露哈,說的在直白點就是記憶體沒有回收釋放,他的空間在無用之後沒有重新插入回系統的空白記憶體連結清單,是以這裡的靈活之處必有弊端哈,因為連結清單的周遊過程是從低位址到高位址的方向,很顯然,堆空間的方向應該按照規定的表上來和,呵呵,按圖索骥嘛。

  3.關于完整的程式執行過程的了解:其實CPU-記憶體-硬碟是三塊緊密聯系的必不可少的分組,就像三權分立似的,呵呵,鑒于現在自己對CPU的寄存器了解的還不是很深,是以隻能知道多少說多少了,首先CPU的寄存器裡存放的是将要進入CPU加法運算器的資料的記憶體(一般是棧)指令集位址,記憶體的棧裡存放的是要送給CPU運算的指令的位址,一次完整的指令執行過程應該是這樣的,首先CPU的指令寄存器裡存放着擷取指令管道的位址,也就是棧指令集的位址,當CPU像該棧發出指令,問,我下一步要幹什麼?棧裡的一個位址資料(應該是在棧頂的)就pop(彈出棧)來告訴CPU,你下一步按照我這條指令的位址去取指令到你的加法電腦中運算吧,下一步,就是把出棧的指向的位址的指令取了,通過(可能是位址總線)三大總線送給CPU,然後再進行運算,這其中在CPU的程式寄存器裡儲存着下一條取指令的記憶體位址,在棧裡即儲存着調用函數前的指令的記憶體位址(棧的傳回位址),也儲存着要調用的該函數的位址,之是以儲存原來的指令位址是友善當調用的函數執行完,友善找到原來的函數調用點之下的位置

  4.在VC裡有三種函數調用方式,__cdcel,__fastcall,__stdcall,他們調用函數入棧的方向都是自右向左的,(這裡有一個疑問,什麼是恢複堆棧平衡的位置???  )沒關系,下面接着說,在VC裡預設就是使用__stdcall來調用函數,如果你想使用其他的函數調用方式,需要自己加額外聲明哈,呵呵,這些所謂調用函數的函數有的是函數的入棧方式不同,有的就是傳遞的參數也不同哈,在C++裡每一個成員函數都有一個this指針,在windows中,這個指針一般是用ecx寄存器來存儲的,如果使用的是GCC編譯器編譯的話,這個參數會作為最後一個參數入棧,也就是在棧頂的,呵呵,這裡有爽了,為什麼this指的是類或者成員函數的位址呐?

  當我學C++的時候隻會記住這些,現在終于可以很好的解釋這一切了,雖然G++和GCC還是各種不同的,也就是在每一個類的執行個體對象在調用它的公共成員函數的時候,都會以該函數為模版為各自開辟新的棧區,之是以要傳遞一個this指針就是為了厘清這個函數是哪個對象的所屬函數,這裡沒猜錯的話,就是在對象的棧中存放着這個函數的位址,call的時候就直接找到他了,并且不會出錯哈,在該函數被調用時,函數的局部變量依次入棧,在最後壓入this指針,在要傳回的時候,也就是要完成調用的時候,該函數的傳回值要傳回給誰?這裡就用到了首先彈棧的就是他的this指針,告訴ECX要把我的傳回值傳回給this的位置,也就是調用的起始位置啦(小解釋:這裡還不是回到函數的調用點的下一條之指令的位址哈,沒有這麼塊,他隻是傳回到他所屬的對象的棧位址,當該對象的棧頂上的棧幀回收後,才會彈棧到esp寄存器,将指令的位址移到原來函數調用點的下一個位置)

  5.在OllyDbg,裡關于棧幀的劃分,是将新棧的棧底當做舊棧的棧頂,就是說ebp即屬于上一個棧幀也屬于下一個棧幀,在這個ODay教材中是堅持了在esp和ebp之間的作為一個棧幀的原則哈,下面要記得,呵呵,書上說這樣劃分的好處是為了更好的看出系統棧的狀态,其實不同的規定并不影響其他的工作哈,就像認為把地球劃分的經緯度一樣

  6.寄存器

  ESP:(extended stack pointer)棧頂指針寄存器,裡面存放的指針永遠指向系統棧最上面一個棧幀的棧頂

  EBP:(extended base pointer) 基址指針寄存器,裡面存放的指針永遠指向系統棧的最上面一個棧幀的底部,嚴格來說,棧幀的底部和系統棧的底部不是一個概念,這裡使用的都是棧幀底部的概念哈

  EIP:(extended instruction pointer)裡面存放的一個指針永遠指向下一條等待執行的指令的位址,也就是說,控制了EIP的内容就控制了程序,我們讓EIP指向哪裡,CPU下一條就執行哪裡的内容,就是所謂的EIP劫持

EAX寄存器以稱為累加器,AX寄存器是算術運算的主要寄存器, 所有的輸入、輸出隻使用AL或AX人作為資料寄存器。 在80386及其以上的微處理器中, EAX寄存器可以用來存儲單元的偏移位址。 EAX可稱為資料寄存器,你除了直接通路外,   還 可分别對其高十六位和低十六位進行通路。 它們的低十六位就是把它們前邊兒的E去掉, 即EAX的低十六位就是AX。 而且它們的低十六位又可以分别進行八位通路,也就是說, AX還可以再進行分解,即AX還可分為AH(高八位)AL( 低八位)。

寄存器定義

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

  寄存器是記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。寄存器通常都是以他們可以儲存的位元數量來估量,舉例來說,一個 “8 位元寄存器”或 “32 位元寄存器”。寄存器現在都以寄存器檔案的方式來實作,但是他們也可能使用單獨的正反器、高速的核心記憶體、薄膜記憶體以及在數種機器上的其他方式來實作出來。 

  寄存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更适當的是稱他們為 “架構寄存器”。 

  例如,x86 指令集定義八個 32 位元寄存器的集合,但一個實作 x86 指令集的 CPU 可以包含比八個更多的寄存器。

  寄存器是CPU内部的元件,寄存器擁有非常高的讀寫速度,是以在寄存器之間的資料傳送非常快。

特點及原理

  寄存器又分為内部寄存器與外部寄存器,所謂内部寄存器,其實也是一些小的存儲單元,也能存儲資料。但同存儲器相比,寄存器又有自己獨有的特點: 

  ①寄存器位于CPU内部,數量很少,僅十四個;

  ②寄存器所能存儲的資料不一定是8bit,有一些寄存器可以存儲16bit資料,對于386/486處理器中的一些寄存器則能存儲32bit資料;

  ③每個内部寄存器都有一個名字,而沒有類似存儲器的位址編号。

  寄存器的功能十分重要,CPU對存儲器中的資料進行處理時,往往先把資料取到内部寄存器中,而後再作處理。外部寄存器是計算機中其它一些部件上用于暫存資料的寄存器,它與CPU之間通過“端口”交換資料,外部寄存器具有寄存器和記憶體儲器雙重特點。有些時候我們常把外部寄存器就稱為“端口”,這種說法不太嚴格,但經常這樣說。

  外部寄存器雖然也用于存放資料,但是它儲存的資料具有特殊的用途。某些寄存器中各個位的0、1狀态反映了外部裝置的工作狀态或方式;還有一些寄存器中的各個位可對外部裝置進行控制;也有一些端口作為CPU同外部裝置交換資料的通路。是以說,端口是CPU和外設間的聯系橋梁。CPU對端口的通路也是依據端口的“編号”(位址),這一點又和通路存儲器一樣。不過考慮到機器所聯接的外設數量并不多,是以在設計機器的時候僅安排了1024個端口位址(這隻是老式的計算機啦,現在都是65536個端口),端口位址範圍為0--3FFH。

寄存器用途

  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。當運算結果沒有産生溢出時,運算結果等于邏輯結果(即因該得到的正确的結果),此時SF表示的是邏輯結果的正負,當運算結果産生溢出時,運算結果不等于邏輯結果,此時的SF值所表示的正負情況與邏輯結果相反,即:SF=0時,邏輯結果為負,SF=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和ESP:作為指針的寄存器,也可作為16位寄存器BP, SP使用,常用于椎棧操作。通常,它被進階語言編譯器用以建造‘堆棧幀‘來儲存函數或過程的局部變量,不過,還是那句話,你可以在其中儲存你希望的任何資料。SS是它的預設段寄存器或選擇器。 

  注意,這四個寄存器沒有對應的8-bit分組。換言之,你可以通過SI、DI、BP、SP作為别名通路他們的低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)所要使用的堆棧位址。這個寄存器也可以被裝入任意數值,你可以通過入棧和出棧操作來給他指派,不過由于堆棧對于很多操作有很重要的意義,是以,不正确的修改有可能造成對堆棧的破壞。 

  * 注意 一定不要在初學彙編的階段把這些寄存器弄混。他們非常重要,而一旦你掌握了他們,你就可以對他們做任意的操作了。段寄存器,或選擇器,在沒有指定的情況下都是使用預設的那個。這句話在現在看來可能有點稀裡糊塗,不過你很快就會在後面知道如何去做。 

  D、指令指針寄存器:

  EIP 這個寄存器非常的重要。這是一個32位寬的寄存器 ,同CS一同指向即将執行的那條指令的位址,存放指令的偏移位址。微處理器工作于實模式下,EIP是IP(16位)寄存器。不能夠直接修改這個寄存器的值,修改它的唯一方法是跳轉或分支指令。(CS是預設的段或選擇器) 

  E、标志寄存器EFR

  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? 寄存器(測試寄存器)用于某些條件測試。

寄存器分類

  資料寄存器 - 用來儲存整數數字(參考以下的浮點寄存器)。在某些簡單/舊的 CPU,特别的資料寄存器是累加器,作為數學計算之用。

  位址寄存器 - 持有存儲器位址,以及用來通路存儲器。在某些簡單/舊的CPU裡,特别的位址寄存器是索引寄存器(可能出現一個或多個)。

  通用目的寄存器 (GPRs) - 可以儲存資料或位址兩者,也就是說他們是結合 資料/位址 寄存器的功用。

  浮點寄存器 (FPRs) - 用來儲存浮點數字。

  常數寄存器 - 用來持有隻讀的數值(例如 0、1、圓周率等等)。

  向量寄存器 - 用來儲存由向量處理器運作SIMD(Single Instruction, Multiple Data)指令所得到的資料。

  特殊目的寄存器 - 儲存CPU内部的資料,像是程式計數器(或稱為指令指針),堆棧寄存器,以及狀态寄存器(或稱微處理器狀态字組)。

  指令寄存器(instruction register) - 儲存現在正在被運作的指令

  索引寄存器(index register) - 是在程式運作實用來更改運算對象位址之用。

  在某些架構下,模式訓示寄存器(也稱為“機器訓示寄存器”)儲存和設定跟處理器自己有關的資料。由于他們的意圖目的是附加到特定處理器的設計,是以他們并不被預期會成微處理器世代之間保留的标準。

  有關從 随機存取存儲器 提取資訊的寄存器與CPU(位于不同晶片的儲存寄存器集合)

  存儲器緩沖寄存器(Memory buffer register)

  存儲器資料寄存器(Memory data register)

  存儲器位址寄存器(Memory address register)

  存儲器型态範圍寄存器(Memory Type Range Registers)[1][2]

段寄存器在尋址過程中的作用

  寄存器(Register)是CPU内部的元件,是以在寄存器之間的資料傳送非常快。用途:1.可将寄存器内的資料執行算術及邏輯運算。2.存于寄存器内的位址可用來指向記憶體的某個位置,即尋址。3.可以用來讀寫資料到電腦的周邊裝置。8086 有8個8位資料寄存器,這些8位寄存器可分别組成16位寄存器:AH&AL=AX:累加寄存器,常用于運算;BH&BL=BX:基址寄存器,常用于位址索引;CH&CL=CX:計數寄存器,常用于計數;DH&DL=DX:資料寄存器,常用于資料傳遞。