程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 匯編教程:控制寄存器和系統地址寄存器

匯編教程:控制寄存器和系統地址寄存器

編輯:匯編語言

80386控制寄存器和系統地址寄存器如下表所示。它們用於控制工作方式,控制分段管理機制及分頁管理機制的實施。
控 制
寄存器 CRx BIT31 BIT30—BIT12 BIT11—BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 CR0 PG 0000000000000000 ET TS EM MP PE CR1 保留 CR2 頁故障線性地址 CR3 頁目錄表物理頁碼 000000000000
BIT47—BIT16 BIT15—BIT0 全局描述符表寄存器GDTR 基地址 界限 中斷描述符表寄存器IDTR 基地址 界限
BIT15—BIT0 局部描述符表寄存器LDTR 選擇子 任務狀態段寄存器TR 選擇子 BIT31—BIT0 BIT31—BIT0 BIT11—BIT0 基地址 界限 屬性 基地址 界限 屬性
<一>控制寄存器

從上表可見,80386有四個32位的控制寄存器,分別命名位CR0、CR1、CR2和CR3。但CR1被保留,供今後開發的處理器使用,在80386中不能使用CR1,否則會引起無效指令操作異常。CR0包括指示處理器工作方式的控制位,包含啟用和禁止分頁管理機制的控制位,包含控制浮點協處理器操作的控制位。CR2及CR3由分頁管理機制使用。CR0中的位5—位30及CR3中的位0至位11是保留位,這些位不能是隨意值,必須為0。

控制寄存器CR0的低16位等同於80286的機器狀態字MSW。

1.保護控制位

控制寄存器CR0中的位0用PE標記,位31用PG標記,這兩個位控制分段和分頁管理機制的操作,所以把它們稱為保護控制位。PE控制分段管理機制。PE=0,處理器運行於實模式;PE=1,處理器運行於保護方式。PG控制分頁管理機制。PG=0,禁用分頁管理機制,此時分段管理機制產生的線性地址直接作為物理地址使用;PG=1,啟用分頁管理機制,此時線性地址經分頁管理機制轉換位物理地址。關於分頁管理機制的具體介紹在後面的文章中進行。

下表列出了通過使用PE和PG位選擇的處理器工作方式。由於只有在保護方式下才可啟用分頁機制,所以盡管兩個位分別為0和1共可以有四種組合,但只有三種組合方式有效。PE=0且PG=1是無效組合,因此,用PG為1且PE為0的值裝入CR0寄存器將引起通用保護異常。

需要注意的是,PG位的改變將使系統啟用或禁用分頁機制,因而只有當所執行的程序的代碼和至少有一部分數據在線性地址空間和物理地址空間具有相同的地址的情況下,才能改變PG位。


 

PG和PE
位與處
理器工
作模式 PG PE 處理器工作方式 0 0 實模式 0 1 保護模式,禁用分頁機制 1 0 非法組合 1 1 保護方式,啟用分頁機制


2.協處理器控制位

控制寄存器CR0中的位1—位4分別標記為MP(算術存在位)、EM(模擬位)、TS(任務切換位) 和ET(擴展類型位),它們控制浮點協處理器的操作。

當處理器復位時,ET位被初始化,以指示系統中數字協處理器的類型。如果系統中存在 80387協處理器,那麼ET位置1;如果系統中存在80287協處理器或者不存在協處理器,那麼ET位清0。

EM位控制浮點指令的執行是用軟件模擬,還是由硬件執行。EM=0時,硬件控制浮點指令傳送到協處理器;EM=1時,浮點指令由軟件模擬。

TS位用於加快任務的切換,通過在必要時才進行協處理器切換的方法實現這一目的。每當進行任務切換時,處理器把TS置1。TS=1時,浮點指令將產生設備不可用(DNA)異常。 MP位控制WAIT指令在TS=1時,是否產生DNA異常。MP=1和TS=1時,WAIT產生異常;MP=0時,WAIT指令忽略TS條件,不產生異常。

3.CR2和CR3

控制寄存器CR2和CR3由分頁管理機制使用。

CR2用於發生頁異常時報告出錯信息。當發生頁異常時,處理器把引起頁異常的線性地址保存在CR2中。操作系統中的頁異常處理程序可以檢查CR2的內容,從而查出線性地址空間中的哪一頁引起本次異常。

CR3用於保存頁目錄表的其始物理地址。由於目錄是頁對齊的,所以僅高20位有效,低12 位保留未用。向CR3中裝入一個新值時,低12位必須為0;但從CR3中取值時,低12位被忽略。每當用MOV指令重置CR3的值時,會導致分頁機制高速緩沖區的內容無效,用此方法,可以在啟用分頁機制之前,即把PG位置1之前,預先刷新分頁機制的高速緩存。CR3寄存器即使在CR0寄存器的PG位或PE位為0時也可裝入,如在實模式下也可設置CR3,以便進行分頁機制的初始化。在任務切換時,CR3要被改變,但是如果新任務中CR3的值與原任務中CR3的值相同,那麼處理器不刷新分頁高速緩存,以便當任務共享也表時有較快的執行速度。

<二>系統地址寄存器

全局描述符表GDT、局部描述符表LDT和中斷描述符表IDT等都是保護方式下非常重要的特殊段,它們包含有為段機制所用的重要表格。為了方便快速地定位這些段,處理器采用一些特殊的寄存器保存這些段的基地址和段界限。我們把這些特殊的寄存器稱為系統地址寄存器。

1.全局描述符表寄存器GDTR

如本文開始處的表格所示,GDTR長48位,其中高32位為基地址,低16位為界限。由於GDT 不能有GDT本身之內的描述符進行描述定義,所以處理器采用GDTR為GDT這一特殊的系統段提供一個偽描述符。GDTR給定了GDT,如下圖所示。

GDTR中的段界限以字節為單位。由於段選擇子中只有13位作為描述符索引,而每個描述符長8個字節,所以用16位的界限足夠。通常,對於含有N個描述符的描述符表的段界限設為8*N-1。

利用結構類型可定義偽描述符如下:

PDESC STRUC   LIMIT DW 0   BASE DD 0   PDESC ENDS 2.局部描述符表寄存器LDTR

局部描述符表寄存器LDTR規定當前任務使用的局部描述符表LDT。如本文開始處的表格所示,LDTR類似於段寄存器,由程序員可見的16位的寄存器和程序員不可見的高速緩沖寄存器組成。實際上,每個任務的局部描述符表LDT作為系統的一個特殊段,由一個描述符描述。而用於描述符LDT的描述符存放在GDT中。在初始化或任務切換過程中,把描述符對應任務LDT的描述符的選擇子裝入LDTR,處理器根據裝入LDTR可見部分的選擇子,從GDT中取出對應的描述符,並把LDT的基地址、界限和屬性等信息保存到LDTR的不可見的高速緩沖寄存器中。隨後對LDT的訪問,就可根據保存在高速緩沖寄存器中的有關信息進行合法性檢查。

LDTR寄存器包含當前任務的LDT的選擇子。所以,裝入到LDTR的選擇子必須確定一個位於GDT中的類型為LDT的系統段描述符,也即選擇子中的TI位必須是0,而且描述符中的類型字段所表示的類型必須為LDT。

可以用一個空選擇子裝入LDTR,這表示當前任務沒有LDT。在這種情況下,所有裝入到段寄存器的選擇子都必須指示GDT中的描述符,也即當前任務涉及的段均由GDT中的描述符來描述。如果再把一個TI位為1的選擇子裝入到段寄存器,將引起異常。

3.中斷描述符表寄存器IDTR

中斷描述符表寄存器IDTR指向中斷描述符表IDT。如本文開始處的表格所示,IDTR長48 位,其中32位的基地址規定IDT的基地址,16位的界限規定IDT的段界限。由於80386只支持256個中斷/異常,所以IDT表最大長度是2K,以字節位單位的段界限為7FFH。IDTR 指示IDT的方式與GDTR指示GDT的方式相同。

4.任務狀態段寄存器TR

任務狀態段寄存器TR包含指示描述當前任務的任務狀態段的描述符選擇子,從而規定了當前任務的狀態段。任務狀態段的格式在後面的文章中介紹。如本文開始處的表格所示,TR也有程序員可見和不可見兩部分。當把任務狀態段的選擇子裝入到TR可見部分時,處理器自動把選擇子所索引的描述符中的段基地址等信息保存到不可見的高速緩沖寄存器中。在此之後,對當前任務狀態段的訪問可快速方便地進行。裝入到TR的選擇子不能為空,必須索引位於GDT中的描述符,且描述符的類型必須是TSS。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved