最近一直在學8086,上課老師突然問了個這。對於問題「8086 cpu 能提供20位的位址資訊,可直接對1m個儲存單元進行訪問,而cpu內部可用來提供位址資訊的暫存器都是16位,那怎樣用16位暫存器來實現20位位址定址呢"明白了不少。
下圖是8086的cpu架構。
那個年代,條件比較差,能湊合的就湊合,能共用的就共用
。8086 cpu的位址匯流排針腳
和資料匯流排針腳
就共用了。
8086是乙個16位的cpu,資料(data)匯流排就有16位,一次性可以傳輸16個位元位。和位址(address)匯流排湊合著一起共用,於是就取名ad0-ad15。
位址匯流排卻不止16個,還多出了a16-a19整整4個呢!這樣有20個位址線,可以定址1mb的記憶體了!
但是8086的暫存器都是16位的啊,只能存放16位的位址。於是用分段式儲存管理
的方法,把記憶體劃分為最大64kb的小塊,為什麼是64kb呢,因為16位位址最多只能定址這麼大了
。然後又加了幾個叫做段暫存器的東西,指向這些塊的開頭,這樣,通過段位址+段內偏移位址
的方式,就能訪問更多的記憶體了。
邏輯位址和實體地址的轉換?(期末考試會考的)
之前說20位的位址資訊可以對1m個記憶體單元進行訪問,就是說編址00000h~fffffh,而段寄器cs,ds,ss,es即存放了這些位址的高4位,如12345h,則某個段暫存器便會儲存1234h高4位資訊,這即為段位址。
而段內偏移位址就是移動後相對於段位址的偏移量。
實體地址就是位址匯流排上提供的20位位址資訊。實體地址=段位址*10h+段內偏移位址。段位址乘以10h是因為段位址當時是取高四位得到的,所以還原後要讓段位址左移4位(10h = 10000b),例如(cs)= 20a8h,(ip)= 2008h,則實體地址為20a8h*10h+2008h = 22a88h。
我的認識:
實體地址表達方法是
十六進製制*16相當於把十六進製制向前移了1位
,fffff(10485575)/1024=1023kb(0~1023kb),【2的20次方等於10485575/1024=1024kb】
斜體為引用。
邏輯位址與實體地址
邏輯位址 logical address 是指由程式產生的與段相關的偏移位址部分。例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,不和絕對實體地址相干。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...
邏輯位址與實體地址
邏輯位址 logical address 例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,與絕對實體地址無關。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段或分頁機制,cpu不進行自動位址轉換 邏輯...
邏輯位址與實體地址
邏輯位址 logical address 是指由程式產生的與段相關的偏移位址部分。例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,不和絕對實體地址相干。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...