注意,這裏討論的是8086CPU段地址和偏移地址的本質含義,而不是爲了解決具體的問題,而在本質含義之上引申出來的更高級的邏輯意義。
不管以多少種不同的邏輯意義去看待“段地址×16+偏移地址=物理地址”的尋址模式,一定要清楚地知道它的本質含義,這樣才能更靈活地利用它來分析解決問題。
如果,只拘泥於某一種引申出來的邏輯含義,而模糊本質含義的話,將從意識上限制對這種尋址功能的靈活應用。
“段地址×16+偏移地址=物理地址”的本質含義:CPU在訪問內存時,用一個基礎地址(段地址×16)和一個相對於基礎地址的偏移地址相加,給出內存單元的物理地址。
更一般地說,8086CPU的這種尋址功能是“基礎地址+偏移地址=物理地址”尋址模式的一種具體實現方案。8086CPU中,段地址×16可看做是基礎地址。
下面,我們用兩個與CPU無關的例子來做進一步的比喻說明。
第一個比喻說明“基礎地址+偏移地址=物理地址”的思想
比如說,學校、體育館,圖書館同在一條筆直的單行路上(參考下圖),學校位於路的起點(從路的起點到學校距離是0米)。
學校、體育館、圖書館的位置關係
你要去圖書館,問我那裏的地址,我可以用兩種方式告訴你圖書館的地址:
(1)從學校走2826m到圖書館。這2826m可以認爲是圖書館的物理地址。
(2)從學校走2000m到體育館。從體育館再走826m到圖書館。第一個距離2000m,相對於起點的基礎地址。第二個距離826m,是相對於基礎地址的偏移地址(以基礎地址爲點的地址)。
第一種方式是直接給出物理地址2826m,而第二種方式是用基礎地址和偏移地址相加來得到物理地址的。
第二個比喻進一步說明“段地址×16+偏移地址=物理地址”的思想。
我們爲上面的例子加一些限制條件,比如,只能通過紙條來互相通信。你問我圖書館的地址,我只能將它寫在紙上告訴你。顯然,我必須有一張可以容納4位數據的紙條,才能寫下2826這個數據。
可以寫下4位數據的紙條
2 |
8 |
2 |
6 |
可不巧的是,我沒有能容納4位數據的紙條,僅有兩張可以容納3位數據的紙條。這樣我只能以這種方式來告訴你2826這個數據。
兩張可以寫下3位數據的紙條
2 |
0 |
0 |
8 |
2 |
6 |
在第一張紙上寫上200(段地址),在第二張紙上寫上826(偏移地址)。假設我們事先對這種情況又有過相關的約定:你得到這兩張紙後,做這樣的運算:200(段地址)×10+826(偏移地址)=2826(物理地址)。
8086CPU就是這樣,一個只能提供兩張3位數據紙條的CPU。
問:簡述段地址和偏移地址。
答:從X地走到Y地,從Y地,走到Z地。X到Y地,也就是段地址。從Y地到Z,也就是偏移地址。兩者相加,也就是實際距離。
問:爲什麼只拘泥於某一種引申出來的邏輯含義,而模糊本質含義的話,將從意識上限制對這種尋址功能的靈活應用?
答:學東西,不要學的太死了。一件事物,有很多答案。
問:爲什麼要有段地址和偏移地址?
答:
Intel 8088時代,計算機的地址總線是20位的,即可以尋址能力可以達到1M字節,但是它的ALU和寄存器都只有16位,也就是表示數的能力只能達64k,再大就逾鍋了。
那怎麼辦呢?INTEL想了一個辦法,讓兩個寄存器對來表示一個物理地址,比如說DS:BX,前者叫段寄存器,後者叫偏址寄存器。
由於這兩個寄存器都是16位,直接相加還是不能匹配20位的地址線的訪問能力,因此,INTEL公司變通了一下,人爲地將這個組合尋址設計成:在它們組合時,讓段寄存器左移四位(假設DS是1234H,左移4位就變成了12340H,至於它內部怎麼實現我們不用管它。
注意,對於16進制的數來說,乘以16就相當於在原數後面補個0,因爲它是逢16進1啊;與10進制數乘10就是後面補0同樣道理。)然後與偏址寄存器相加,這樣得到的地址最大可以到0FFFFFH。這樣行了。
現在都32位機了,甚至64位了,所以上面的尋址方法在保護模式下不再用了。