暫存器運算元:(存放在cpu中)
mov ax,0ffffh
ax 即為暫存器運算元。
運算元本身存放於暫存器中,在指令中只是給出了幾個位的**來表示它具體存放在那個暫存器中。
記憶體中的資料經過暫存器讀入cpu,進入資料的運算。記憶體運算元:(存放在記憶體中)
其儲存於某記憶體區域,因此叫記憶體運算元。
mydata dw 1234h 或 mydata db 12h等
上述中mydata這樣的變數
xx db 0ffh,0
mov bx, offset xx //用offset運算子計算出xx單元的偏移值
mov ax,[bx]
上述中[bx]就叫做非變數名直接定址的記憶體運算元
最早期的8086 cpu只有一種工作方式,那就是實模式,而且資料匯流排為16位,位址匯流排為20位,實模式下所有暫存器都是16位。
而從80286開始就有了保護模式,從80386開始cpu資料匯流排和位址匯流排均為32位,而且暫存器都是32位。
但80386以及現在的奔騰,酷睿等等cpu為了向前相容都保留了實模式,現代作業系統在剛加電時首先執行在實模式下,然後再切換到保護模式下執行。
1.實模式定址方式
8086cpu資料匯流排為16位,也就是一次最多能取2 ^ 16 = 64kb資料,這個資料也解釋了實模式下為什麼每個段最大只有64kb。
但其位址匯流排為20位,這樣它能定址的能力其實是2 ^ 20 = 1mb,這也就是實模式下cpu的最大定址能力。那即然它有1mb定址能力,那怎麼用16位的段暫存器表示呢?
這就引出了分段的概念,8086cpu將1mb儲存空間分成許多邏輯段,每個段最大限長為64kb(但不一定就是64kb)。 這樣每個儲存單元就可以用「段基位址+段內偏移位址」表示。
段暫存器是因為對記憶體的分段管理而設定的。 計算機需要對記憶體分段,以分配給不同的程式使用(類似於硬碟分頁)。段暫存器含有段值,為訪問儲存器形成實體地址時,處理器引用相應的某個段暫存器並將其值乘以16,形成20位的段基位址。
因此,段基位址由16 位段暫存器值左移4位表達,段內偏移表示相對於某個段起始位置的偏移量 。
2.保護模式定址方式
段暫存器不再儲存段基址,而是儲存段選擇子,不再需要段暫存器左移加偏移。真正的段基址存在描述符快取記憶體中。
在保護方式下,為了訪問儲存器形成線性位址時,處理器要使用選擇子所指定的描述符中的基位址等資訊。為了避免在每次儲存器訪問時,都要訪問描述符表而獲得對應的段描述符,從80286開始每個段暫存器都配有乙個高速緩衝暫存器,稱之為段描述符高速緩衝暫存器或描述符投影暫存器,對程式設計師而言它是不可見的。每當把乙個選擇子裝入到某個段暫存器時,處理器自動從描述符表中取出相應的描述符,把描述符中的資訊儲存到對應的高速緩衝暫存器中。此後對該段訪問時,處理器都使用對應高速緩衝暫存器中的描述符資訊,而不用再從描述符表中取描述符。這種方式下,每個段暫存器一共96位,分為兩部分:
可見的選擇子用來找到gdt/ldt表的乙個段描述符,用這個段描述符填充這80位不可見部分。
下圖為段選擇符結構,段選擇符為16位,它不直接指向段,而是通過指向的段描述符,段描述符再定義段的資訊。
其中ti用來指明全域性描述符表gdt還是區域性描述符表ldt,rpl表示請求特權級,索引值為13位。
儲存管理部件把主存(物理儲存器)和輔存(磁碟)看作是乙個整體,即虛擬儲存器。486允許虛擬儲存器容量最大為246=64t,即程式設計師可在此位址範圍內程式設計,程式可大大超過物理空間。
下面再來看段描述符結構,段描述符表中的每一項為乙個段描述符,每一項為8位元組,其結構如下圖所示。
從圖中可知,段選擇符指向的段描述符裡有三個部分基位址資訊,這三部分組成乙個32位位址就決定了段基位址位置,此位址再加上段內偏移最終確定線性位址位置。
注:如果不分頁的話,線性位址就是實體地址;
如果分頁的話,則由分頁部件把線性位址轉換為
實體地址。
實模式:儲存空間僅分段,而不分頁;
保護模式:儲存空間先分段,再分頁。
邏輯位址是cpu所生成的位址 ,指的是機器語言指令中,用來指定乙個運算元或者是一條指令的位址。
**邏輯位址其實是邏輯上的位址,實模式下由「段基位址+段內偏移」組成;保護模式下由「段選擇符+段內偏移」組成。邏輯位址經分段機制後就成線性位址。 **
如指令:
1.直接定址
mov bx, ds:[1234h] //表示從ds資料段偏移位址為1234h的單元取數——>bx
假設(ds)=5000h 可計算出
線性位址為16d×(ds)+1234h=16d×5000h+1234h=50000h+1234h=51234h 。
命令的最後結果就是把線性位址為51234h的儲存單元中的運算元據放入bx中
2.間接定址
格式:段暫存器:[間址暫存器] / [間址暫存器]
注意:可省略段暫存器是因為會到預設約定的段暫存器中取內容資料
例:mov ds,資料段段基址
mov bx,buf單元的偏移位址
mov al,ds:[bx]
等價於:mov al,[bx]
間接暫存器和約定訪問的邏輯段如下圖所示:
在我們進行程式開發的時候,一般情況下,是不需要管理記憶體的,也不需要操心記憶體夠不夠用,其實,這就是分頁機制給我們帶來的好處。它是實現虛擬儲存的關鍵,位於線性位址與實體地址之間,在使用這種記憶體分頁管理方法時,每個執行中的程序(任務)可以使用比實際記憶體容量大得多的連續位址空間。而且當系統記憶體實際上被分成很多凌亂的塊時,它可以建立乙個大而連續的記憶體空間的映象,好讓程式不用操心和管理這些分散的記憶體塊。分頁機制增強了分段機制的效能。頁位址變換是建立在段變換基礎之上的。因為,段管理機制對於intel處理器來說是最基本的,任何時候都無法關閉。所以即使啟用了頁管理功能,分段機制依然是起作用的,段部件也依然工作。
為什麼需要分頁記憶體管理?
因為有以下優點:
不會產生外部碎片化(空間碎片化的根源就是每個程式的大小不一樣,這樣在空間分配時不存在一致性。解決的辦法自然是將空間按照某種規定的大小進行分配。將虛擬記憶體和物理記憶體都分成大小一樣的部分,我們稱之為「頁」。),乙個程序占用的記憶體空間可以不是連續的,
乙個程序的虛擬頁面在不需要時,可以存放在磁碟上,不需要全部同時載入到記憶體上。
可以共享小的位址,即頁面共享。只要給相應的頁表裡面做乙個相應的記錄便可。
在二級分頁系統的機制下:
32位的虛擬位址中,高10位(22-31)用來在頁目錄表中定位乙個頁目錄表項(pde),pde中有頁表的實體地址。找到頁表後,中間10位(12-21)則用來在頁表中定位乙個頁表項(pte),pte中有分配的物理頁位址。餘下低12位則用於頁內偏移量。
依據以下步驟進行轉換:
cr3暫存器中取出程序的頁目錄位址(作業系統負責在排程程序的時候,把這個位址裝入對應暫存器);
根據線性位址前十位,在陣列中,找到對應的索引項,因為引入了二級管理模式,頁目錄中的項,不再是頁的位址,而是乙個頁表的位址。(又引入了乙個陣列),頁的位址被放到頁表中去了。
根據線性位址的中間十位,在頁表(也是陣列)中找到頁的起始位址;
將頁的起始位址與線性位址中最後12位相加,得到最終我們想要的實體地址;
實模式與保護模式詳解三 定址方式
尋找運算元實體地址的方式叫定址方式 運算元在指令中 指令的運算元部分就是運算元本身 也叫立即數 運算元存放在cpu暫存器中 指令的運算元部分是暫存器的編碼 也叫暫存器運算元 運算元存放在記憶體中 指令的運算元部分包含運算元所在的記憶體位址 也叫儲存器運算元 立即數定址 e.g.mov al,10h ...
實模式與保護模式
實模式與保護模式 1.實模式,又叫實位址模式,cpu完全按照8086的實際定址方法訪問從00000h fffffh 1mb大小 的位址範圍的記憶體,在這種模式下,cpu只能做單任務執行 定址公式為 實體地址 左移4位的段位址 偏移位址,即 實體地址是由16位的段位址和16位的段內偏移位址組成的。2....
實模式與保護模式
實模式 即實位址訪問模式 它是intel公司80286及以後的x86 80386,80486和80586等 相容處理器 cpu 的一種操作模式。實模式被特殊定義為20位位址記憶體可訪問空間上,這就意味著它的容量是2的20次冪 1m 的可訪問記憶體空間 物理記憶體和bios rom 軟體可通過這些位址...