Chapter3 BASIC EXECUTION ENVIRONMENT

3.3 內存組織

處理器在其總線上地址的內存地址稱爲物理內存地址。物理內存按 8 位字節序列組織。每一個字節都分配一個惟一的地址,稱爲物理地址地址。若是處理器不支持英特爾 64 架構,則物理地址空間範圍爲 236 × 1 (64 Gb)。 英特爾 64 架構引入了物理地址和線性地址空間的變化。程序員

3.3.1 IA-32內存模式

  • 平面內存模型– 內存在程序中顯示爲單個連續地址空間。此空間稱爲線性地址空間。代碼、數據和堆棧都包含在此地址空間中。線性地址空間是可字節尋址的,地址從 0 到 232 -1 (若是不是在 64 位模式下)。線性地址空間中任何字節的地址稱爲線性地址。
  •   分段內存模型內存在程序中顯示爲一組稱爲段的獨立地址空間。代碼、數據和堆棧一般包含在單獨的段中。要解決段中的字節問題,程序會發出邏輯地址。它由段選擇器和偏移量組成(邏輯地址一般稱爲遠指針)。段選擇器對要訪問的段進行標識,偏移量標識段地址空間中的字節。在 IA-32 處理器上運行的程序能夠處理多達 16,383 個不一樣大小和類型的段,而且每一個段能夠高達 232字節。
  •   實址模式內存型號這是英特爾 8086 處理器的內存型號。支持它提供與編寫在英特爾 8086 處理器上運行的現有程序的兼容性。實址模式使用分段內存的特定實現,其中程序和操做系統/執行的線性地址空間由每一個大小高達 64 KB 的段數組組成。實地址模式下線性地址空間的最大大小爲 220字節。

3.3.2 分頁和虛擬內存

使用平面或分段內存模型,線性地址空間直接或經過分頁映射處處理器的物理地址空間。使用直接映射(禁用分頁),每一個線性地址與物理地址具備一對一的對應關係。線性地址在處理器的地址行上發送,無需轉換。編程

當使用 IA-32 體系結構的分頁機制(啓用了分頁),線性地址空間被劃分爲映射到虛擬內存的頁面。而後根據須要將虛擬內存的頁映射到物理內存中。當操做系統或執行程序使用分頁時,分頁機制對應用程序是透明的。應用程序看到的只是線性地址空間。數組

此外,IA-32 架構的分頁機制包括支持如下的擴展:數據結構

       物理地址擴展 (PAE) 用於處理大於 4 GB 的物理地址空間。架構

       頁面大小擴展 (PSE) 用於將線性地址映射到 4-Mbtes 頁中的物理地址。app

3.3.3 64位內存組織

 

英特爾 64 架構支持大於 64 GB 的物理地址空間;IA-32 處理器的實際物理地址大小是特定於實現的。在 64 位模式下, 64 位線性地址空間的體系結構支持。可是,支持英特爾 64 架構的處理器可能實現不到 64 位。線性地址空間經過 PAE 分頁機制映射處處理器物理地址空間。ide

3.3.4 操做模式與內存模型

 

       保護模式當處於受保護模式時,處理器可使用本節中描述的任何內存。(僅當處理器處於虛擬 8086 模式時,才使用實尋模式內存模型。)使用的內存模型取決於操做系統或執行系統的設計。實現多任務化時,單個任務可使用不一樣的內存模型。函數

       實地址模式在實地址模式下,處理器僅支持實地址模式內存模型。測試

       系統管理模式- SMM ,處理器切換到單獨的地址空間,稱爲系統管理 RAM (SMRAM)。用於尋址此地址空間中的字節的內存模型與實地址模式模型相似。有關 SMM 中使用的內存模型的詳細信息,請參閱英特爾 ® 64 IA-32 體系結構軟件開發人員的 Manual 3C中的第 34 "系統管理模式"編碼

       兼容性模式須要在兼容模式下運行的軟件應遵循與在 32 位保護模式下運行的內存模型相同的內存模型。分段的效果與 32 位保護模式語義中的效果相同。

       64 位模式-段寄存器一般被(但不是徹底)禁用,從而建立平面 64 位線性地址空間。具體來講,處理器在 64 位模式下將 CSDSES SS 的段基視爲零(這使得線性地址等於有效地址)。分段和實地址模式在 64 位模式下不可用。

3.3.6 保護模式下的擴展物理尋址

P6 系列處理器開始,IA-32 架構支持高達 64 GB(236字節)的物理內存尋址。程序或任務沒法直接尋址此添加空間中的位置。相反,它解決單個線性地址空間,最多 4 Gb,經過虛擬內存管理機制映射到 64 G 字節物理地址空間。使用此機制,操做系統可使程序在64 G 字節物理地址空間內旋轉 4-GByte 線性地址空間。

使用擴展物理尋址須要處理器在受保護模式下運行,操做系統須要提供虛擬內存管理系統。請參閱英特爾® 64 IA-32 體系結構軟件開發人員手冊的第 3A" 3 "保護模式內存管理"中的"使用 PAE 分頁機制的 36 位物理卡尋址"

3.4 基本寄存器

 

IA-32 體系結構提供了 16 個基本程序執行寄存器,用於通常系統和應用程序編程。這些寄存器能夠按照如下方式分組:


       通用寄存器。這八個寄存器可用於存儲操做數和指針。

       段寄存器。這些寄存器最多包含六個段選擇器。

       EFLAGS(程序狀態和控制)寄存器。EFLAGS 註冊報告正在執行的程序的狀態,並容許對處理器進行有限的(應用程序級別)控制。

       EIP(指令指針)寄存器。EIP 寄存器包含指向要執行的下一個指令的 32 位指針。

 

 

3.4.1 通用寄存器

 

提供 32 位通用寄存器 EAXEBXECXEDXESIEDIEBP ESP,用於保存如下項目:

       邏輯運算和算術運算的操做數

       地址計算的操做數

       內存指針

儘管全部這些寄存器均可用於通常操做數、結果和指針的操做,但引用 ESP 寄存器時應謹慎使用。ESP 寄存器保存堆棧指針,做爲通常規則,不該用於其餘目的。

 

 

 

本卷第 5 "指令集摘要"介紹了通用寄存器的特殊用途。另請參閱:英特爾第 3 章、第 4 章和第 5 ® 64 IA-32 體系結構軟件開發人員手冊、第 2A卷、2B 2C卷。如下是特殊用途的摘要:

       EAX = 用於操做數和結果數據的累加器

       EBX = 指向 DS 段中的數據的指針

       ECX = 字符串和循環操做的計數器

       EDX = I/O 指針

       ESI = 指向 DS 寄存器指向的段中數據的指針;字符串操做的源指針

       EDI = 指向 ES 寄存器指向的段中的數據(或目標)的指針;字符串操做的目標指針

       ESP = 堆棧指針( SS 段中)

       EBP = 指向堆棧上數據的指針( SS 段中)

 

 

3.4.1.1 64位模式下通用寄存器

64 位模式下, 16 個通用寄存器,默認操做數大小爲 32 位。可是,通用寄存器可以處理 32 位或 64 位操做數。若是指定了 32 位操做數大小:提供 EAXEBXECXEDXEDIESIEBPESPR8D - R15D。若是指定了 64 位操做數大小:提供 RAXRBXRCXRDXRDIRSIRBPRSPR8-R15R8D-R15D/R8-R15 表明 8 個新的通用寄存器。全部這些寄存器均可以在byteworddword qword 級別訪問。REX 前綴用於生成 64 位操做數大小或引用寄存器 R8-R15

僅在 64 位模式(R8-R15 XMM8-XMM15)下提供的寄存器在從 64 位模式到兼容性模式的過渡中保留,而後從新轉換爲 64 位模式。可是,R8-R15 XMM8-XMM15 的值在從 64 位模式經過兼容性模式過渡到舊模式或實模式,而後經過兼容性模式返回 64 位模式後未定義。

 

 

在64位模式下,訪問字節寄存器有一些限制。指令不能同時引用舊的高字節(例如:AH、BH、CH、DH)和一個新的字節寄存器(例如:RAX寄存器的低字節)。可是,指令能夠同時引用舊的低字節(例如:AL、BL、CL或DL)和新字節寄存器(例如:R8寄存器的低字節,或RBP)。該體系結構經過使用REX前綴將指令的高字節引用(AH、BH、CH、DH)更改成低字節引用(BPL、SPL、DIL、SIL: RBP、RSP、RDI和RSI的低8位)來實現這一限制。

因爲64位通用寄存器的上32位在32位模式中沒有定義,因此當從64位模式切換到32位模式(切換到受保護模式或兼容模式)時,任何通用寄存器的上32位都不會被保留。在64位到32位模式切換以後,軟件必須不依賴這些位來維護值。

3.4.2 段寄存器

段寄存器(CSDSSSESFS GS)包含 16 位段選擇器。段選擇器是標識內存中段的特殊指針。要訪問內存中的特定段,該段的段選擇器必須出如今適當的段寄存器中。

 

CSDSSS ES 這四個段寄存器與英特爾 8086 和英特爾 286 處理器中的段寄存器相同,FS GS 寄存器經過英特爾 386 ™處理器系列引入 IA-32 架構。

3.4.2.1 64位模式下段寄存器

64 位模式下:不管關聯的段描述符基的值如何,CSDSESSS 都被視爲每一個段基數爲 0。這將爲代碼、數據和堆棧建立 flat 地址空間。FS GS 是例外。在線性地址計算(在本地數據和某些操做系統數據結構的尋址中),這兩個段寄存器均可以用做附加基寄存器。

即便分段一般是禁用的,段寄存器加載可能會致使處理器執行段訪問檢查。在這些活動期間,啓用的處理器仍將對加載的值執行大多數遺留檢查(即便這些檢查不適用於64位模式)。這類檢查是必要的,由於以64位模式加載的段寄存器可能被以兼容模式運行的應用程序使用。

64 位模式下禁用對 CSDSESSSFS GS 的限制檢查(段界限嗎?)

3.4.3 EFLAGS寄存器

 

32 位 EFLAGS 寄存器包含一組狀態標誌、一個控制標誌和一組系統標誌。在處理器初始化後(經過斷言 RESET 引腳或 INIT 引腳),EFLAGS寄存器的狀態爲 00000002H。此寄存器的位 一、三、五、15 和 22 到 31 保留。軟件不該使用或依賴於這些位中的任何一個狀態。

 

 

 可使用如下指令將一組標誌移動到過程堆棧或EAX寄存器:LAHF、SAHF、PUSHF、PUSHFD、POPF和POPFD。將EFLAGS寄存器的內容傳輸到過程堆棧或EAX寄存器後,可使用處理器的位操做指令(BT、BTS、BTR和BTC)檢查和修改這些標記。

當掛起一個任務(使用處理器的多任務處理設施)時,處理器自動將EFLAGS寄存器的狀態保存在任務狀態段(TSS)中,以供掛起任務使用。當將本身綁定到一個新任務時,處理器用新任務的TSS中的數據加載EFLAGS寄存器。
當調用中斷或異常處理程序時,處理器自動將EFLAGS寄存器的狀態保存在過程堆棧上。當使用任務切換處理中斷或異常時,EFLAGS寄存器的狀態將保存在TSS中,以供掛起任務使用。

3.4.2.1 狀態標誌

EFLAGS 寄存器的狀態標誌(位 0、二、四、六、7 和 11)指示算術指令(如 ADD、SUB、MUL 和 DIV 指令)的結果

CF(位 0)

進位標誌位- 設置若是算術運算生成攜帶或借用結果的最有符號的icant 位;不然清除。此標誌指示無符號整數算術的溢出條件。它還用於多精度算術。

PF(位 2)

奇偶校驗標誌位- 若是結果中最低顯著性字節包含 1 位的偶數,則設置;不然清除。

AF(位 4)

輔助進位標誌位- 設置若是算術運算生成攜帶或借用結果的位 3;不然清除。此 flag 用於二進制編碼十進制 (BCD) 算術。

ZF(位 6)

零標誌位- 若是結果爲零,則設置;不然清除。

SF(位 7)

符號標誌位- 設置爲等於結果中最重要的位,即帶符號整數的符號位。(0 表示正值,1 表示負值。

OF(位 11)

溢出標誌位- 若是整數結果太大,則設置正數或負數過小(不包括符號位),以適合目標操做數;不然清除。此標誌指示符號整數(兩個補碼)的溢出條件。

 在這些狀態標誌中,只有 CF 標誌能夠直接修改,使用 STC、CLC 和 CMC 指令。此外,位指令(BT、BTS、BTR 和 BTC)將指定的位複製到 CF 標誌中。

狀態標誌容許單個算術運算爲三種不一樣的數據類型生成結果:無符號整數、有符號整數和 BCD 整數。若是算術運算的結果被視爲無符號整數,CF 標誌表示範圍外條件(進位或借位);若是 做爲符號整數(兩個補號)吃,則 OF 標誌表示進位或借位;若是被視爲 BCD 數字,則 AF 標誌表示進位或借位。SF 標誌表示帶符號的整數的符號。ZF標誌指示有符號或無符號整數零。

在整數上執行多精度算術時,CF 標誌與帶進位 (ADC) 的加法一塊兒使用,並減去借用 (SBB) 指令,將進位或借位從一個計算傳播到下一個計算。

條件指令 Jcc (跳轉到條件代碼cc),SETcc (字節設置條件代碼cc),LOOPcc, 和CMOVcc (條件移動) 使用一個或多個狀態標誌做爲條件代碼,並測試其分支、設置字節或結束循環條件。

3.4.2.2 DF標誌

方向標誌(DF,位於 EFLAGS 寄存器的位 10 中)控制字符串指令(MOVS、CMPS、SCAS、LODS 和 STOS)。設置 DF 標誌會致使字符串指令自動遞減(處理從高地址到低地址的字符串)。清除 DF 標誌會致使字符串指令自動遞增(處理從低添加器到高地址的字符串)。

STD 和 CLD 指令分別設置並清除 DF 標誌。

3.4.2.3 系統標誌和IOPL字段

EFLAGS 寄存器控制操做系統或執行操做中的系統標誌和 IOPL 字段。應用程序不該修改它們.系統標誌的功能以下:

TF(位 8) 陷阱標誌 -設置爲啓用單步模式進行調試;清除以禁用單步模式。

IF(位 9)

中斷啓用標誌- 控制處理器對可屏蔽中斷請求的響應。設置爲響應可屏蔽中斷;清除以抑制可屏蔽的中斷

IOPL(位 12 and 13)

 

I/O 權限級別字段= 指示當前正在運行的程序或任務的 I/O 權限級別。當前正在運行的程序或任務的當前特權級別 (CPL) 必須小於或等於 I/O 特權級別才能訪問 I/O地址空間。只有在 CPL 爲 0 時,POPF 和 IRET 指令才能修改此字段。

NT (位 14)

嵌套任務標誌-控制中斷和調用任務的連接。設置當前任務連接到之前執行的 task 時;噹噹前任務未連接到其餘任務時清除。

RF(位 16)

恢復標誌-控制處理器對調試異常的響應。

VM(位 17)

虛擬8086模式標- 設置爲啓用虛擬8086模式;清除以返回保護模式,而不使用虛擬-8086模式語義。

AC(位 18)

對齊檢查(或訪問控制)標誌- 若是在 CR0 寄存器中設置了 AM 位,則僅當此標誌爲 1 時,將啓用用戶模式數據訪問的對齊檢查。

若是在 CR4 寄存器中設置了 SMAP 位,則若是此位爲 1,則容許對用戶模式頁的顯式管理模式數據訪問。參見英特爾第 4.6 節"訪問權限"® 64 和 IA-32 體系結構軟件開發人員手冊,第 3A 卷

VIF(位 19)

虛擬中斷標誌= IF 標誌的虛擬映像。與 VIP 標誌一塊兒使用。(要使用此標誌和 VIP 標誌經過設置控制寄存器 CR4 中的 VME 標誌來啓用虛擬模式擴展。

VIP (位 20)

虛擬中斷掛起標誌= 設置爲指示中斷處於掛起狀態;當沒有中斷掛起時清除。(軟件設置並清除此標誌;處理器僅讀取它。與 VIF 標誌一塊兒使用。

ID(位 21)

標識標誌-程序可以發出或清除此標誌,表示對 CPUID 指令的支持。

3.4.3.4 RFLAGS Register in 64-Bit Mode

In 64-bit mode, EFLAGS is extended to 64 bits and called RFLAGS. The upper 32 bits of RFLAGS register is reserved. The lower 32 bits of RFLAGS is the same as EFLAGS.

3.5 指令指針

指令指針寄存器包含當前代碼段中要執行的下一條指令的偏移量。在執行JMP、Jcc、CALL、RET和IRET指令時,它能夠在直線代碼中從一個指令邊界前進到下一個指令邊界,也能夠由多個指令向前或向後移動。

軟件不能直接訪問EIP寄存器;它由控制傳輸指令(如JMP、Jcc、CALL和RET)、中斷和異常隱式地控制。讀取EIP寄存器的惟一方法是執行一條調用指令,而後從過程堆棧中讀取返回指令指針的值。經過修改過程堆棧上返回指令指針的值並執行返回指令(RET或IRET),能夠間接加載EIP寄存器。參見6.2.4.2節,「返回指令指針」。

全部IA-32處理器預取指令。因爲指令預取,在指令加載期間從總線讀取的指令地址與EIP寄存器中的值不匹配。儘管不一樣的處理器代使用不一樣的預取機制,EIP寄存器引導程序流的功能仍然徹底兼容全部編寫在IA-32處理器上運行的軟件。(?????)

3.6 操做數大小和地址大小屬性

當處理器在受保護模式下執行時,每一個代碼段都有一個默認的操做數大小屬性和地址大小屬性。這些屬性在代碼段的段描述符中使用 D(默認大小)標誌選擇(請參閱英特爾® 64 和 IA-32 體系結構軟件開發人員手冊的第 3A 卷中的第 3 章"受保護模式內存管理").設置 D 標誌時,將選擇 32 位操做數大小和地址大小屬性;若是設置 D 標誌,則選擇 32 位操做數大小和地址大小屬性。當標誌清晰時,將選擇 16 位大小屬性。當處理器在實地址模式、虛擬 8086 模式或 SMM 中執行時,默認操做數大小和地址大小屬性始終爲 16 位。

操做數大小屬性選擇操做數的大小。當 16 位操做數大小屬性生效時,操做數一般能夠是 8 位或 16 位,當 32 位操做數大小屬性生效時,操做數一般能夠是 8 位或 32 位。

地址大小屬性選擇用於解決內存的地址大小:16 位或 32 位。當 16 位地址大小屬性生效時,段偏移和位移爲 16 位。此限制將段的大小限制爲 64 KBytes。當 32 位地址大小屬性生效時,段偏移和位移爲 32 位,容許尋址多達 4 Gb。

經過將操做數大小和/或地址大小前綴添加到指令中,能夠覆蓋特定指令的默認操做數大小屬性和/或地址大小屬性。請參閱英特爾® 64 和 IA-32 體系結構軟件開發人員手冊第 2 卷第 2A 章中的"說明格式"。前綴的效果僅適用於目標指令.

顯示有效的操做數大小和地址大小(在受保護模式或兼容性模式下執行時),具體取決於 D 標誌的設置以及操做數大小和地址大小前綴。

3.6.1 64 位模式下的操做數大小和地址大小

在 64 位模式下,默認地址大小爲 64 位,默認操做數大小爲 32 位。可使用前綴覆蓋默認值。地址大小和操做數大小前綴容許按指示方式混合 32/64 位數據和 32/64 位地址。表 3-4 顯示了 66H 指令前綴和 REX 的有效組合。W 前綴,可用於在 64 位模式下指定操做數大小覆蓋。請注意,在 64 位模式下不支持 16 位地址。

REX 前綴由 4-bit 字段組成,這些字段構成 16 個不一樣的值。REX 前綴中的 W 位字段稱爲 REX。W. 若是 REX.W 字段設置正確,前綴指定操做數大小覆蓋爲 64 位。請注意,軟件仍可使用操做數大小 66H 前綴切換爲 16 位操做數大小。可是,設置 REX。使用 W 時,W 優先於操做數大小前綴 (66H)。

對於 SSE/SSE2/SSE3/SSSE3 SIMD 指令:操做碼擴展必須使用 66H、F2H 和 F3H 前綴。在這種狀況下,有效的 REX 之間沒有交互。W 前綴和 66H 操做碼擴展前綴。

請參閱英特爾第 2 章"指令格式"® 64 和 IA-32 體系結構軟件開發人員手冊(第 2A 卷)。

 

3.7 操做方式尋址

IA-32 機器指令做用於零個或多個操做數。某些操做數是顯式指定的,而其餘操做數是隱式的。源操做數的數據能夠位於:

  • 指令自己(當即操做數)
  • 寄存器
  • 內存位置
  • I/O 端口

當指令將數據返回到目標操做數時,能夠將其返回到:

  • 寄存器
  • 內存位置
  • I/O 端口

3.7.1 當即操做數

某些指令使用指令自己編碼的數據做爲源操做數。這些操做數稱爲"當即操做數"(或只是直接操做數)。例如,如下 ADD 指令將 EAX regis ter 的內容添加到當即值 14:

ADD EAX, 14

全部算術指令(DIV 和 IDIV 指令除外)都容許源操做數成爲即時值。指令容許的直接操做數的最大值因指令而異,但毫不能大於無符號雙字整數 (232)的最大值。

3.7.2                註冊操做數

源和目標操做數能夠是如下任一寄存器,具體取決於正在執行的指令:

  • 32 位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP或 EBP)
  • 16 位通用寄存器(AX、BX、CX、DX、SI、DI、SP 或 BP)
  • 8 位通用寄存器(AH、BH、CH、DH、AL、BL、CL 或 DL)
  • 段寄存器(CS、DS、SS、ES、FS 和 GS)
  • EFLAGS 寄存器
  • x87 FPU 寄存器(ST0 到 ST七、狀態字、控制字、標記字、數據操做數指針和指令指針)
  • MMX 寄存器(MM0 至 MM7)
  • XMM 寄存器(XMM0 至 XMM7)和 MXCSR 寄存器
  • 控制寄存器(CR0、CR二、CR3 和 CR4)和系統表指針寄存器(GDTR、LDTR、IDTR和任務寄存器)
  • 調試寄存器(DR0、DR一、DR二、DR三、DR6 和 DR7)
  • MSR 寄存器

某些指令(如 DIV 和 MUL 指令)使用包含在一對 32 位寄存器中的四字操做數。寄存器對用分隔它們的冒號表示。例如,在寄存器對 EDX:EAX 中,EDX 包含高位,EAX 包含四字操做數的低位。

提供了若干說明(如 PUSHFD 和 POPFD 指令)來加載和存儲 EFLAGS 寄存器的內容,或在此寄存器中設置或清除單個標誌。其餘 ininsjin(如 Jcc指令)使用 EFLAGS 寄存器中的狀態標誌的狀態做爲分支或其餘決策操做的條件代碼。

處理器包含一系列系統寄存器,用於控制內存管理、中斷和異常處理、任務管理、處理器管理和調試活動。其中一些系統寄存器可經過一組系統指示進行訪問,應用程序、操做系統或執行機構能夠訪問。當使用系統指令訪問系統寄存器時,寄存器一般是指令的隱含操做數。

3.7.2.1 在 64 位模式下寄存器操做數

在 64 位模式下寄存器操做數能夠是如下任一操做數:

  • 64 位通用寄存器(RAX、RBX、RCX、RDX、RSI、RDI、RSP、RBP 或 R8-R15)
  • 32 位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP 或 R8D-R15D)
  • 16 位通用寄存器(AX、BX、CX、DX、SI、DI、SP、BP 或 R8W-R15W)
  • 8 位通用註冊器:AL、BL、CL、DL、SIL、DIL、SPL、BPL 和 R8L-R15L 均使用 REX 前綴;AL、BL、CL、DL、AH、BH、CH、DH 都可用,無需使用 REX 前綴。
  • 分段寄存器(CS、DS、SS、ES、FS 和 GS)
  • RFLAGS 寄存器
  • x87 FPU 寄存器(ST0 到ST七、狀態字、控制字、標記字、數據操做數指針和指令指針)
  • MMX 寄存器(MM0 至 MM7)
  • XMM 寄存器(XMM0 至 XMM15)和 MXCSR 寄存器
  • 控制寄存器(CR0、CR二、CR三、CR4 和 CR8)和系統表指針 regisi(GDTR、LDTR、IDTR 和任務寄存器)
  • 調試寄存器(DR0、DR一、DR二、DR三、DR6 和 DR7)
  • MSR 寄存器
  • RDX:RAX 寄存器對,表示 128 位操做數

3.7.3 內存操做數

內存中的源和目標操做數經過段選擇器和偏移量進行引用(參見圖 3-9)。段選擇器指定包含操做數的段。偏移指定操做數的線性或有效地址。偏移量 can 爲 32 位(由表示法 m16:32 表示)或 16 位(由表示法 m16:16 表示)。

3.7.3.1  64 位模式下的內存操做數

在 64 位模式下,內存操做數能夠由段選擇器和偏移量引用。偏移量能夠是 16 位、32 位或 64 位(參見圖 3-10)。

3.7.4 指定段選擇器

能夠隱式或顯式指定段選擇器。指定段選擇器的最多見方法是將其加載到段寄存器中,而後容許處理器根據執行的操做數類型隱式選擇寄存器。處理器根據表 3-5 中給出的規則自動選擇段。

在內存中存儲數據或從內存加載數據時,能夠重寫 DS 段默認值以容許訪問其餘段。對於彙編器,段覆蓋一般使用冒號":"運算符"來處理。例如,如下 MOV 指令將值從寄存器 EAX 移動到 ES 寄存器指向的段。入段的偏移量包含在EBX 寄存器中:MOV ES:[EBX]、EAX

表 3-5. 默認段選擇規則

參考類型

已註冊

使用的段

默認選擇規則

指示

CS

代碼段

全部指令。

堆棧

SS

堆棧段

全部堆棧推送和彈出。

使用 ESP 或 EBP 寄存器做爲基本寄存器的任何內存引用。

本地數據

DS

數據段

全部數據引用,但相對於堆棧或字符串目標時除外。

目標字符串

ES

使用 ES 寄存器指向的數據段

字符串指令的目標。

在計算機級別,使用段覆蓋前綴指定段覆蓋,該前綴是放置在指令開頭的字節。沒法覆蓋如下默認段選擇:

  • 指令提取必須從代碼的參數進行。
  • 字符串指令中的目標字符串必須存儲在 ES 寄存器指向的數據段中。
  • 推送和彈出操做必須始終引用 SS 段。

某些指令要求顯式指定段選擇器。在 These 狀況下,16 位段選擇器能夠位於內存位置或 16 位寄存器中。例如,如下 MOV 指令將位於寄存器 BX 中的段選擇器移動到段寄存器 DS 中:

MOV DS, BX

段選擇器也能夠顯式指定爲內存中 48 位遠指針的一部分。此處,內存中的第一個雙字包含偏移量,下一個單詞包含段選擇器。

3.7.4.1  64 位模式下的分段

在 IA-32e 模式下,分段的效果取決於處理器是在兼容模式仍是 64 位模式下運行。在兼容模式下,分段功能與傳統 IA-32 模式下的功能相同,使用上述 16 位或 32 位保護模式 semantics。

在 64 位模式下,分割一般(但不是徹底)禁用,從而建立一個平面 64 位線性地址空間。處理器將 CS、DS、ES、SS 的段基視爲零,建立一個等於有效地址的線性地址。例外狀況是 FS 和 GS 段,其段寄存器(包含段基)在某些線性地址計算中可用做附加基寄存器。

3.7.5 指定偏移

內存地址 ca n 的偏移部分直接指定爲靜態值(稱爲位移)或經過由如下一個或多個組件組成的地址計算:

  • 位移= 8 位、16 位或 32 位值。
  • = 通用寄存器中的值。
  • 索引= 通用寄存器中的值。
  • 比例因子= 乘以索引值的值 二、4 或 8。

添加這些組件產生的偏移量稱爲有效地址。除縮放因子外,每一個組件均可以具備正值或正(2s 補碼)值。圖 3-11 顯示了將這些組件組合在選定段中建立有效地址的全部可能方法。

通用寄存器做爲基元或索引組件的使用受到如下限制:

  • ESP 寄存器不能用做索引寄存器。
  • 當 ESP 或 EBP 寄存器用做基時,SS 段是默認段。在全部其餘狀況下,DS 段是默認段。

基、索引和位移組件能夠任意組合使用,這些組件中的任何一個均可覺得 NULL。僅當也使用索引時,才能使用比例因子。每種可能的組合對於高級語言和彙編語言中progr ammer 經常使用的數據結構都頗有用。

如下尋址模式建議地址組件的常見組合的用途。

  • 位移-僅置換表示對操做數的直接(未計算)偏移。因爲位移在指令中編碼,所以這種形式的地址有時稱爲絕對或靜態地址。它一般用於訪問靜態 allacat 標量操做數。·基地·000年僅基數表示對操做數的間接偏移。因爲基寄存器中的值能夠更改,所以可用於變量和數據結構的動態存儲。
  • 基礎 = 位移=基本寄存器和散點拉板可用於兩個不一樣的目的:

• 當元素大小不是 二、4 或 8 字節時,做爲數組中的索引 — 位移組件將靜態偏移編碼到數組的開頭。基本寄存器保存計算結果,以肯定數組中特定元素的偏移量。

• 訪問記錄的字段:基本寄存器保存記錄開頭的地址,而位移是該字段的靜態偏移。

這種組合的一個重要特殊功能是訪問過程激活記錄中的參數。過程激活記錄是在輸入過程時建立的堆棧幀。在這裏,EBP 寄存器是基本寄存器的最佳選擇,由於它會自動選擇堆棧段。這是此常見函數的緊湊編碼。

  • (索引=刻度) = 位移·000年當元素大小爲 二、4 或 8 字節時,此地址模式提供了一種將索引到靜態數組的有效方法。位移定位數組的開頭,索引寄存器保存所需數組元素的下標,處理器經過應用縮放因子自動將下標轉換爲索引。
  • 基 = 索引 = 位移=使用兩個寄存器,將一個二維數組(位移包含數組開頭的地址)或記錄數組的幾個實例之一(位移是偏移到記錄中的字段)。
  • base = (Index = Scale) = 位移=將全部尋址組件一塊兒使用,當數組的元素大小爲 二、4 或 8 字節時,能夠有效地索引二維數組。

3.7.5.1  在 64 位模式下指定偏移

64 位模式下內存地址的偏移部分能夠直接指定爲靜態值,或經過由如下一個或多個組件組成的地址計算指定:

  • 位移 = 8 位、16 位或 32 位值。
  • 基 = 64位通用寄存器中的值。
  • 索引 = 64 位通用寄存器中的值。
  • 比例因子 =乘以索引值的值 二、4 或 8。

在大多數狀況下,基值和索引值能夠在 16 個可用的通用寄存器之一中指定。請參閱英特爾® 64 和 IA-32 體系結構軟件開發人員手冊第 2 卷第 2A 章中的"說明格式"。

還提供如下地址組件的惟一組合。

  • RIP = 位移=在 64 位模式下,RIP-relative 尋址使用帶符號的 32 位位移來經過符號擴展 32 位值並添加到 RIP 中的 64 位值來計算下一指令的有效地址。

3.7.6                          彙編器和編譯器尋址模式

在機器代碼級別,在指令中對位移、基寄存器、索引寄存器和比例因子的seled組合進行編碼。全部彙編器都容許程序員使用這些尋址組件的任何容許組合來解決操做數。高級 language 編譯器將根據程序員定義的語言構造選擇這些組件的適當組合。

3.7.7              I/O 端口尋址

處理器支持包含多達 65,536 個 8 位 I/O 端口的 I/O 地址空間。在I/O 地址空間中也能夠定義 ar e 16 位和 32 位端口。I/O 端口可使用 DX 寄存器中的即時操做數或值進行尋址。有關 I/O 端口尋址的詳細信息,請參閱第 18 章"輸入/輸出"。

相關文章
相關標籤/搜索