-
段寄存器
鎖定
- 中文名
- 段寄存器
- 外文名
- Segment Register
- 領 域
- 彙編語言
- 隸 屬
- 寄存器
- 個 數
- 16位CPU有四個16位段寄存器
段寄存器段寄存器的產生
段寄存器的產生源於Intel 8086 CPU體系結構中數據總線與地址總線的寬度不一致。數據總線的寬度,也即是ALU(算數邏輯單元)的寬度,平常説一個CPU是“16位”或者“32位”指的就是這個。8086CPU的數據總線是16位。
[3]
地址總線的寬度不一定要與ALU的寬度相同。因為ALU的寬度是固定的,它受限於當時的工藝水平,當時只能製造出16位的ALU;但地址總線不一樣,它可以設計得更寬。地址總線的寬度如果與ALU相同當然是不錯的辦法,這樣CPU的結構比較均衡,尋址可以在單個指令週期內完成,效率最高;而且從軟件的解決來看,一個變量地址的長度可以用整型或者長整型來表示會比較方便。但是,地址總線的寬度還要受制於需求,因為地址總線的寬度決定了系統可尋址的範圍,即可以支持多少內存。如果地址總線太窄的話,可尋址範圍會很小。如果地址總線設計為16位的話,可尋址空間是2^16=64KB,這在當時被認為是不夠的;Intel最終決定要讓8086的地址空間為1M,也就是20位地址總線。地址總線寬度大於數據總線會帶來一些麻煩,ALU無法在單個指令週期裏完成對地址數據的運算。有一些容易想到的可行的辦法,比如定義一個新的寄存器專門用於存放地址的高4位,但這樣增加了計算的複雜性,程序員要增加成倍的彙編代碼來操作地址數據而且無法保持兼容性。
[3]
Intel想到了一個折中的辦法:把內存分段,並設計了4個段寄存器,CS,DS,ES和SS,分別用於指令、數據、其它和堆棧。把內存分為很多段,每一段有一個段基址,當然段基址也是一個20位的內存地址。不過段寄存器仍然是16位的,它的內容代表了段基址的高16位,這個16位的地址後面再加上4個0就構成20位的段基址。而原來的16位地址只是段內的偏移量。這樣,一個完整的物理內存地址就由兩部分組成,高16位的段基址和低16位的段內偏移量,當然它們有12位是重疊的,它們兩部分相加在一起,才構成完整的物理地址。
[3]
段寄存器含義
8086CPU有20根地址線,最大可尋址內存空間為1MB。而8086的寄存器只有16位,指令指針(IP)和變址寄存器(SI、DI)也是16位的。用16位的地址尋址1MB空間是不可能的。所以就要把內存分段,也就是把1MB空間分為2^4,即16個段,每段不超過64KB(2^16,16位數據線就可以尋址)。在8086中設置4個16位的段寄存器,用於管理4種段:CS是代碼段,DS是數據段,SS是堆棧段,ES是附加段。把內存分段後,每一個段就有一個段基址,段寄存器保存的就是這個段基址的高16位,這個16位的地址左移四位(後面加上4個0)就可構成20位的段基址。
[2]
段寄存器CS指向存放程序的內存段,IP是用來存放下條待執行的指令在該段的偏移量,把它們合在一起可在該內存段內取到下次要執行的指令。
段寄存器SS指向用於堆棧的內存段,SP是用來指向該堆棧的棧頂,把它們合在一起可訪問棧頂單元。另外,當偏移量用到了指針寄存器BP,則其缺省的段寄存器也是SS,並且用BP可訪問整個堆棧,不僅僅是隻訪問棧頂。
段寄存器寄存器
寄存器(Register),是中央處理器內的其中組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器。
暫存器是存儲器層次結構中的最頂端,也是系統操作數據的最快速途徑。暫存器通常都是以他們可以保存的比特數量來估量,舉例來説,一個8位暫存器或32位暫存器。暫存器現在都以暫存器數組的方式來實現,但是他們也可能使用單獨的正反器、高速的核心存儲器、薄膜存儲器以及在數種機器上的其他方式來實現出來。
這個名詞通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器組羣。更適當的是稱他們為“架構暫存器”。例如,x86指令集定義八個32位暫存器的集合,但一個實現x86指令集的CPU可以包含比八個更多的暫存器。
段寄存器組成
段寄存器:在8086系統中,訪問存儲器的地址碼由段地址和段內偏移地址兩部分組成。段寄存器用來存放各分段的邏輯基值,並指示當前正在使用的4個邏輯段,包括代碼段寄存器CS、堆棧段寄存器SS、數據段寄存器DS和附加段數據寄存器ES。
段寄存器分類
代碼段寄存器CS(Code Segment)
存放當前正在運行的程序代碼所在段的段基址,表示當前使用的指令代碼可以從該段寄存器指定的存儲器段中取得,相應的偏移量則由IP提供。
數據段寄存器DS(Data Segment)
指出當前程序使用的數據所存放段的最低地址,即存放數據段的段基址。
堆棧段寄存器SS(Stack Segment)
指出當前堆棧的底部地址,即存放堆棧段的段基址。
附加段寄存器ES(Extra Segment)
指出當前程序使用附加數據段的段基址,該段是串操作指令中目的串所在的段。