彙編學習(7)

美國Intel公司是目前國際上最有影響的微處理器生產廠家,已有近三十年的生產歷史,80x86系列微處理器是其主導產品,佔據了CPU市場的絕大部分份額。80x86的主要特徵見表11.1。

 

8086/8088
80286
80386
80486
Pentium
數據總線DB
準16
16
32
32
64
地址總線AB
20
24
32
32
32
最大尋址
1MB
16MB
4GB
4GB
4GB
時鐘範圍(MHz)
4.77
6~16
16~40
33~120
66~166
執行速度(MIPS)
0.05
0.4~0.8
3~4
20~75
112~280

 

 80x86的寄存器可分爲程序可見寄存器程序不可見寄存器兩大類,程序可見寄存器(圖11.1)是可以由指令使用的寄存器,而程序不可見寄存器是一般應用程序中不使用而由系統使用的寄存器(圖11.8)。

 
  
程序可見寄存器又分爲通用寄存器、專用寄存器和段寄存器三類。

  通用寄存器
   EAX  AX  AH  AL
   EBX  BX  BH  BL
   ECX  CX  CH  CL
   EDX  DX  DH  DL
   ESI  SI
   EDI  DI
   EBP  BP
   ESP  SP

  專用寄存器:包括指令指針寄存器和標誌寄存器(圖11.2)。
  EIP   IP
  EFLAGS FLAGS

  段寄存器
  CS DS SS ES FS GS
  其中ES、FS、GS都是附加數據段,無缺省組合,必須加段前綴加以說明。


  
程序不可見寄存器包括:

   系統地址寄存器

   控制寄存器:保存全局性的機器狀態

   排錯(DEBUG)寄存器
  
   頁面測試寄存器

系統地址寄存器
  GDTR:保存GDT的線性基地址(32位)和界限值(16位)
  IDTR: 保存IDT的線性基地址(32位)和界限值(16位)
  LDTR:保存LDT所在段的選擇器值(16位)
  TR: 保存任務狀態段TSS所在的段的選擇器值(16位)

控制寄存器:保存全局性的機器狀態
  CR0:機器控制寄存器,包括分頁允許、任務切換、保護允許等
  CR2:頁保護線性地址寄存器,監測出頁故障時產生
  CR3:頁目錄基地址寄存器,包含頁目錄表的物理地址

排錯(DEBUG)寄存器
  DR0 - DR3:指定線性斷點地址
  DR6: 顯示斷點的當前狀態
  DR7: DR0~DR3設置斷點的範圍

頁面測試寄存器
  TR6: 虛擬地址
  TR7: 實地址

 11.2.1 新增的尋址方式

  
在386及其後繼機型新增加的尋址方式中,引入了比例因子(Scale factor),其值可爲1,2,4或8。在尋址中,可用變址寄存器的內容乘以比例因子來取得變址值。這類尋址方式對訪問元素長度爲2,4,8字節的數組特別有用。

  (1)比例變址尋址方式
 (Scaled indexed addressing)
EA = (變址寄存器) * 比例因子 + 位移量

  例1:MOV EAX, COUNT[ESI * 4]
  如果要求把雙字數組COUNT中的元素3送到EAX中,用這種尋址方式可直接在ESI中放入3,選擇比例因子4(數組元素爲4字節長)就可以方便地達到目的(動畫),而不必象在相對寄存器尋址方式中要把變址值直接裝入寄存器中。

 

16位 尋 址
32位 尋 址
位 移 量
0,8,16位
0,8,32位
基 址 寄 存 器
BX,BP
任何32位通用寄存器(包括ESP)
變 址 寄 存 器
SI,DI
除ESP以外的32位通用寄存器
比 例 因 子
1,2,4,8

 
  
我們前面介紹的程序都是基於實模式(Real Mode)的,因爲它們都依賴於段寄存器中的實地址值。實模式是DOS最早也是最簡單的內存尋址模式,但實模式程序只能訪問常規內存,對於80286、特別是80386以上內存可擴充到4GB這樣大的系統,要想發揮它們的強大功能,就需要使用另外的工作方式。

  對於Intel微處理器系列,保護模式(Protected Mode)的概念在80286上已開始使用,它允許訪問裝在第一個1M字節之上的程序和數據,操作起來就如同訪問常規存儲器;除此之外,386以上機器的內存管理還可以使用分頁機制,以便訪問多達16TB的虛擬存儲器。下面先介紹一下保護模式中的基本概念。

 
11.4.1 描述符、選擇器和描述符表

  
描述符:每個描述符佔用8個字節,描述存儲器段的位置、長度及控制和狀態信息,其格式如圖11.3所示。

 描述符由基地址、界限、訪問權和附加字段四部分組成:

  (1)基地址(Base):80386以上處理器的基地址爲32位,說明段可以從4GB存儲器的任何地址開始。

  (2)界限(Limit): 存放着該段的段長度。80386及其後繼機型的界限部分爲20位,
  
  粒度位G(Granularity):在其描述符中給出了一個粒度位G。


  當G=0時,段長的粒度單位爲字節,這樣20位段界限可使段長從1B到1MB,步距爲1B;

  當G=1時,段長的粒度單位爲頁,每頁爲4KB,所以20位段界限可定義的段長從1×4KB到1M×4KB,即從4KB到4GB,步距爲4KB。


 (3)訪問權(Access rights):說明該段在系統中的功能,並給出訪問該段的一些控制信息。應用程序的訪問權字節可表示如圖11.4所示。

其中:
 P(Present)存在位: P=1說明該段已裝入物理存儲器,其基地址和界限值有效;
            P=0說明該段並未裝入物理存儲器,基地址和界限值無用,如訪問該段則會引起不存在異常。

 DPL(Descriptor Privilege Level)描述符特權級字段:
  用來指定該段的特權級0~3,0級爲最高特權級。在保護模式下,當訪問某段時,必須進行特權測試,根據其特權級的高低來決定是否允許訪問該段。一般系統程序處於0級,用戶程序處於3級。

 S(Segment Descriptor)段描述符位:
  S=0表示該段爲系統段;
  S=1表示該段爲應用程序的代碼段或數據(包括堆棧)段。

 E(Executable)可執行位:
  E=0說明該段爲不可執行段,即數據段;
  E=1則說明該段爲可執行段,即代碼段。
 
 ED(Expansion Direction)擴展方向位:
  ED=0表示該段爲向上擴展段,指數據段。
  ED=1表示該段爲向下擴展段,指堆棧段。

 W(Writeable)可寫位:
  W=0指示數據段不能寫入;
  W=1指示數據段可以寫入。在堆棧段的情況下W必須爲1。

  C(Conforming)符合位:在保護模式下,對段的訪問要受特權級的限制。一般來說,系統程序的特權級爲0,處於高特權級;而用戶應用程序的特權級爲3,處於低特權級。對特權的管理是有一整套嚴格的規則的,一般低特權級程序不允許任意訪問或調用高特權級程序,必須在系統管理下,服從一定的規則才允許訪問或調用。然而,在某些情況下,這種調用又是必須的。例如,系統提供的一些標準子程序如數學庫、碼制轉換程序以及一些常用的處理異常情況下的例行程序如除法錯、超出界限等異常處理又經常需要提供應用程序使用。爲方便起見,設置了C位。

 C=1的代碼段稱爲符合(Conforming)段,這種段允許特權級與它相同或特權級比它低的程序調用或通過JMP指令轉入;
 C=0的代碼段稱爲非符合(Non-conforming)段,低特權級的程序對高特權級的非符合段的調用或轉入將產生保護異常。

  系統就採用這種方法把一些常用的例行程序放在C=1的代碼段中,使它們可以方便地爲不同特權級的程序所共享。

 R(Readable)可讀位:
  R=0指示代碼段只能執行不能讀出;
  R=1指示代碼段既可執行又可讀出。

  後一種情況可用於在某些特殊情況下有一些常數可以和指令碼放在一起,此時系統可利用這一特性提供讀出這些常數的方法。

 A(Accessed)已訪問位:
  A=0表示該段尚未被訪問過;
  A=1表示該段已被訪問過。

  此時的選擇器已裝入段寄存器或該段已用於選擇器測試指令。該位的設立便於軟件對段使用情況的監控。

 G粒度位:
  G=0時,段長的粒度單位爲字節;
  G=1時,段長的粒度單位爲頁。
 
 D/B位:
 在代碼段裏,這位稱爲D(Default operation size) 缺省操作長度位。
  D=1表示操作數及有效地址長度均爲32位;
  D=0則爲16位操作數和16位有效地址。
 
 在數據段裏,這位稱爲B位。
  B=1使用32位ESP寄存器;
  B=0則使用16位SP寄存器。

 AVL(Available)可用位:
  該位只能由系統軟件使用。
  描述符的內容是由系統設置的,它全面地描述了段的大小,段在存儲器中的位置以及段的各種屬性。

選擇器和描述符表:

  描述符存放在描述符表中,描述符表都存放在存儲器中,每個表分別構成一個64KB長的段,表中可存放8K描述符,一共有三種描述符表:
  全局描述符表(GDT):包含系統所有任務都可用的描述符
  局部描述符表(LDT):包含了與一個給定任務有關的描述符
  中斷描述符表(IDT):通過門描述符可尋址到相應的中斷處理程序入口

  選擇器存放在段寄存器中,16位長,其格式如圖11.5所示。

11.4.2 保護模式下的存儲器尋址

  從邏輯地址通過選擇器找到描述符表,再找到描述符,由此確定所選段和存儲單元的過程如動畫所


  
保護模式下的存儲器尋址帶來兩個問題:

  (1)選擇器給出了描述符表中的描述符地址,那麼描述符表又在哪裏呢?怎麼能找到它呢?

  (2)保護模式的尋址過程並不複雜,只是間接地取得存儲器地址而已。但是,正因爲間接,就要增加一次對存儲器的訪問,以取得描述符,從而找到所要的段。這樣,在保護模式下,訪問時間會增加很多。那麼怎樣保證系統的運行速度呢?

  圖11.6給出了80x86處理器的程序不可見寄存器。其中GDTR、IDTR和LDTR分別爲全局描述符表寄存器、中斷描述符表寄存器和局部描述符表寄存器。GDTR和IDTR中分別存放對應描述符表的基地址和界限值。當使用保護模式工作時,由系統將基地址和界限值填入GDTR

 虛擬8086方式(Virtual-8086 Mode)是一種在保護模式下運行的類似實模式的工作方式,它具有以下特點(左)。

(1)保護模式下啓動,與8086兼容,提供最大靈活性:
     允許同時在8086操作系統下執行8086的應用程序和在80386操作系統下執行80386的應用程序。

  (2)V86尋址方式與實址方式一樣:
     PA=(sreg)×16+offset

  (3)V86程序與保護方式一樣需經特權級檢查:
     實址方式:隱含爲在特權級0下運行,不會產生特權違法。
     V86方式:規定在特權級3下運行,執行特權指令會產生保護故障。

  (4)V86方式的進入和退出等效於特權級別的變化和堆棧的切換:
     進入:通過調用(CALL)和跳轉(JMP)到一個TSS(Task State Segment),並通過此TSS的VM=1,即可進入V86方式。
     退出:跳轉(JMP)到VM=0的TSS(在特權級0下)。

  (5)V86方式屬於保護模式環境的一部分:
     V86模式下所有硬件中斷和軟件中斷都對應保護模式下的IDT項,而不是對應實地址模式下的中斷機制。

在保護模式下,中斷尋址過程依賴於中斷描述符表IDT,每類中斷和異常對應IDT中的一個8字節的門描述符,通過IDT可以"分門別類"的處理各種中斷和異常,以保護中斷操作不受到其它任務的侵害。

  在保護模式下,中斷例行程序的入口是通過中斷描述符表找到中斷描述符來取得。由於每個描述符爲8字節長,所以類型號應乘以8才能取得所指定類型的中斷描述符。
 
 11.6.1 中斷描述符表(IDT)
  
 
(1)門描述符
  
  (2)任務門
  
  (3)中斷門和陷阱門

 
11.6.3 中斷過程

  以一條中斷指令INT n爲例,由於中斷描述符表IDT的線性基地址與表的大小由IDTR的base字段和limit字段指明,所以根據中斷類型號計算出base + n * 8,即是該中斷IDT項的地址,取出IDT項中的門描述符,經過訪問權檢驗,並將選擇器值(selector)送入CS,偏移量(offset)送入EIP,即獲得了陷阱處理子程序的入口地址(動畫)。

  裝入和存儲IDTR的指令是LIDT和SIDT。這兩條指令只能由當前特權級爲0的過程(一般爲操作系統)使用,一般應用程序不能設置和保存IDTR。

  格式:LIDT mem ;將IDT的基地址和段限裝入IDTR
  格式:SIDT mem ;將IDTR的段限部分和線性基地址寫入

  在IDT相應的項中設置中斷門、陷阱門和任務門的工作一般由操作系統完成,但相關的服務接口目前還未形成統一標準,有的內部調用隨操作系統(如DOS、Windows)及其不同版本變動很大,調用時應加以小心。

 

(2)基址比例變址尋址方式
 (Based scaled indexed addressing)
EA = (變址寄存器) * 比例因子+(基址寄存器)
  例:MOV ECX, [EAX][EDI * 4]

  (3)相對基址比例變址尋址方式
(Relative based scaled indexed addressing)
EA = (變址寄存器) * 比例因子+(基址寄存器)+位移量
  例:MOV EAX, TABLE[EBP][EDI * 4]

  歸納起來,有效地址的計算可以下式表示:
EA = 基址 +(變址 * 比例因子)+位移量

  這四個成分中,除比例因子是固定值外,其他三個成分都可正可負,以保證指針移動的靈活性。

  8086/80286只能使用16位尋址,而80386及其後繼機型則既可用32位尋址,也可用16位尋址。在這兩種情況下,對以上四種成分的組成有不同的規定,表11.2說明了這一規定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章