複製鏈接
請複製以下鏈接發送給好友

段寄存器

鎖定
段寄存器是因為對內存的分段管理而設置的。計算機需要對內存分段,以分配給不同的程序使用(類似於硬盤分頁)。在描述內存分段時,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理屬性(禁止寫入/禁止執行/系統專用等)。需要用8個字節(64位)存儲這些信息,但段寄存器只有16位,因此段寄存器中只能存儲段號(segment selector,也譯作“段選擇符”),再由段號映射到存在內存中的GDT(global (segment) descriptor table,全局段號記錄表),讀取段的信息。 [1] 
16位CPU有四個16位段寄存器,所以,其程序可同時訪問四個不同含義的段。
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] 
中文名
段寄存器
外文名
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可訪問整個堆棧,不僅僅是隻訪問棧頂。
段寄存器DS指向數據段,ES指向附加段,在存取操作數時,二者之一和一個偏移量合併就可得到存儲單元物理地址。該偏移量可以是具體數值、符號地址和指針寄存器的值等之一,具體情況將由指令的尋址方式來決定。
通常,缺省的數據段寄存器是DS,只有一個例外,即:在進行串操作時,其目的地址的段寄存器規定為ES。當然,在一般指令中,我們還可以通過改變前綴中的“段取代”字段來改變操作數的段寄存器。
“可選用的段寄存器”即是可以用強置説明這些段寄存器的值來作為其操作數地址的段地址

段寄存器寄存器

寄存器(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)
指出當前程序使用附加數據段的段基址,該段是串操作指令中目的串所在的段。
參考資料
  • 1.    【日】川合秀實 著 周自恆 李黎明 曾祥江 張文旭 譯.30天自制操作系統[圖靈程序設計叢書]:人民郵電出版社,2012年8月:110-111
  • 2.    內存為什麼分段  .百度知道[引用日期2014-09-04]
  • 3.    段寄存器  .360doc圖書館[引用日期2015-03-15]