最根本的原因是8086空有20位地址線卻只有16位寄存器
當然在解釋這句話之前很有必要先說清楚分段機制,首先8086的分段機制是不同於普通的分段機制的。對於普通分段機制來說,是用以解決重定位問題的——對於你自己的代碼,你確實可以自己安排一個可用的內存地址讓處理器加載你的程序到此處(這稱為絕對地址),但出於對他人加載你的程序/你加載他人的程序的考慮,為了使你的程序在任一個可用的內存地址上加載時都可以正常執行,在編寫程序時就需要使用邏輯地址(或者說是相對地址),那么使用相對地址為什么能讓別人加載你的程序也能正常執行呢?因為當程序被加載時,這些程序代碼內被安排好的相對地址就可以根據程序實際被加載的地址來重新計算——這就是重定位。
分段機制通過段地址加上偏移地址的方式解決了重定位的問題——舉個例子,你在程序代碼內聲明了3個存儲單元打算留給變量(從上面討論中我們在聲明時應避免使用像0xC3210,xC322,0xC323這樣的絕對地址,而是應該使用像0x0000,0x0001,0x0002這樣的相對地址)分別是相對於改代碼段開頭的距離0處,距離1處和距離2處的3個存儲單元。然后一旦程序被處理器加載到某個可用地址比如0xXXX0處,這樣經重定位計算后程序會在0xXXX0,0xXXX1,0xXXX2處聲明3個存儲單元地址給變量。這里的好處一是避免了訪問到非法的地址空間,再就是能使得處理器在內存任何位置處加載該程序都能使得程序擁有正確可用的地址空間。在這個例子中段地址就是0xXXX0,偏移地址就是0x0000,0x0001,0x0002——這便是分段機制
這就是需要分段機制的原因,但是8086在實現分段機制時卻有個麻煩——理論上20位地址線可以尋址
220=1048576=0xFFFFF(15*65536+15*4096+15*256+15*16+16*1)(以十六進制表示的物理地址最多是5位)
但8086實際上卻只有16位寄存器,16位寄存器最大可以表示的地址空間為
216=65536=0xFFFF(15*4096+15*256+15*16+16*1)(以十六進制表示的物理地址最多是4位)
你可以看到以現有的寄存器無法訪問到理應能尋址到的大部分地址空間,因此8086的分段機制是段地址先乘上16或者說左移4位(左移1個二進制位相當於乘上21,這里相當於乘上24)再加上偏移地址
這就是8086需要這樣的分段機制的由來