邏輯位址與實體地址的轉換

2021-07-12 01:57:04 字數 1349 閱讀 7907

最近一直在學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實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...