|
段寄存器的產生 段寄存器的產生源于Intel 8086 CPU體系結構中數據總線與地址總線的寬度不一致。數據總線的寬度,也即是ALU(算數邏輯單元)的寬度,平常說一個CPU是“16位”或者“32位”指的就是這個。8086CPU的數據總線是16位。 地址總線的寬度不一定要與ALU的寬度相同。因為ALU的寬度是固定的,它受限于當時的工藝水平,當時只能制造出16位的ALU;但地址總線不一樣,它可以設計得更寬。地址總線的寬度如果與ALU相同當然是不錯的辦法,這樣CPU的結構比較均衡,尋址可以在單個指令周期內完成,效率最高;而且從軟件的解決來看,一個變量地址的長度可以用整型或者長整型來表示會比較方便。但是,地址總線的寬度還要受制于需求,因為地址總線的寬度決定了系統(tǒng)可尋址的范圍,即可以支持多少內存。如果地址總線太窄的話,可尋址范圍會很小。如果地址總線設計為16位的話,可尋址空間是2^16=64KB,這在當時被認為是不夠的;Intel最終決定要讓8086的地址空間為1M,也就是20位地址總線。地址總線寬度大于數據總線會帶來一些麻煩,ALU無法在單個指令周期里完成對地址數據的運算。有一些容易想到的可行的辦法,比如定義一個新的寄存器專門用于存放地址的高4位,但這樣增加了計算的復雜性,程序員要增加成倍的匯編代碼來操作地址數據而且無法保持兼容性。 Intel想到了一個折中的辦法:把內存分段,并設計了4個段寄存器,CS,DS,ES和SS,分別用于指令、數據、其它和堆棧。把內存分為很多段,每一段有一個段基址,當然段基址也是一個20位的內存地址。不過段寄存器仍然是16位的,它的內容代表了段基址的高16位,這個16位的地址后面再加上4個0就構成20位的段基址。而原來的16位地址只是段內的偏移量。這樣,一個完整的物理內存地址就由兩部分組成,高16位的段基址和低16位的段內偏移量,當然它們有12位是重疊的,它們兩部分相加在一起,才構成完整的物理地址。 總之一句話,段寄存器的設計是一個權宜之計,現在看來可以說是一個臨時性的解決方案,設計它的目的是為了把地址空間從64KB擴展為1MB,僅此而已。 段寄存器的種類 16位CPU有四個段寄存器,所以,其程序可同時訪問四個不同含義的段。段寄存器及其偏移量的引用關系如圖所示。
8086CPU有4個段寄存器:CS、DS、SS、ES。
CS+IP:段寄存器CS指向存放程序的內存段,IP是用來存放下條待執(zhí)行的指令在該段的偏移量,把它們合在一起可在該內存段內取到下次要執(zhí)行的指令。 SS+SP:段寄存器SS指向用于堆棧的內存段,SP是用來指向該堆棧的棧頂,把它們合在一起可訪問棧頂單元。另外,當偏移量用到了指針寄存器BP,則其缺省的段寄存器也是SS,并且用BP可訪問整個堆棧,不僅僅是只訪問棧頂。 DS/ES+有效地址:段寄存器DS指向數據段,ES指向附加段,在存取操作數時,二者之一和一個偏移量合并就可得到存儲單元的物理地址。該偏移量可以是具體數值、符號地址和指針寄存器的值等之一,具體情況將由指令的尋址方式來決定。 通常,缺省的數據段寄存器是DS,只有一個例外,即:在進行串操作時,其目的地址的段寄存器規(guī)定為ES。當然,在一般指令中,我們還可以用強置前綴的方法來改變操作數的段寄存器。 |
|
|
來自: orion360doc > 《匯編語言》