x86
x86泛指一系列基於Intel 8086且向下相容的中央處理器指令集架構。最早的8086處理器於1978年由Intel推出,為16位元微處理器。
推出年份 | 1978年(16位元)、1985年(32位元)、2003年(64位元) |
---|---|
設計公司 | Intel、AMD |
是否開放架構? | 部分 |
字長/暫存器資料寬度 | 32、64、128 |
位元組序 | 小端序 |
指令集架構設計策略 | CISC |
該系列較早期的處理器名稱是以數字來表示80x86。由於以「86」作為結尾,包括Intel 8086、80186、80286、80386以及80486,因此其架構被稱為「x86」。由於數字並不能作為註冊商標,因此Intel及其競爭者均在新一代處理器使用可註冊的名稱,如Pentium,來描述x86架構下的處理器產品。現時英特爾將其稱為IA-32,全名為「Intel Architecture, 32-bit」,一般情形下指代32位元的架構。
歷史
編輯x86架構於1978年推出的Intel 8086中央處理器中首度出現,它是從Intel 8008處理器中發展而來的,而8008則是發展自Intel 4004的。8086在三年後為IBM PC所選用,之後x86便成為了個人電腦的標準平台,成為了歷來最成功的CPU架構。
其他公司也有製造x86架構的處理器,計有Cyrix(現為威盛電子所收購)、NEC集團、IBM、IDT以及Transmeta。Intel以外最成功的製造商為AMD,其早先產品Athlon系列處理器的市場份額僅次於Intel Pentium。
8086是16位元處理器;直到1985年32位元的80386的開發,這個架構都維持是16位元。接著一系列的處理器表示了32位元架構的細微改進,推出了數種的擴充,直到2003年AMD對於這個架構發展了64位元的擴充,並命名為AMD64。後來英特爾也推出了與之相容的處理器,並命名為Intel 64。兩者一般被統稱為x86-64或x64,開創了x86的64位元時代。
值得注意的是英特爾早在1990年代就與惠普合作提出了一種用在安騰系列處理器中的獨立的64位元架構,這種架構被稱為IA-64。IA-64是一種嶄新的系統,和x86架構完全沒有相似性;不應該把它與x86-64或x64弄混。
CPU紀元朝代 | 面市時間 (西元 年) |
卓越的CPU型號 | 記憶體位置找尋空間 | 引入功能及註釋 | |||
---|---|---|---|---|---|---|---|
序列 | 類比 | 實體 | |||||
x86 | 第一代 | 1978 | Intel 8086, Intel 8088(1979) | 16位元 | 無 | 20位元 | 16位元 架構, IBM PC (8088), IBM PC/XT (8088) |
1982 | Intel 80186, Intel 80188 NEC V20/V30(1983) |
8086-2架構, 嵌入技術(80186/80188) | |||||
第二代 | Intel 80286及其克隆產品 | 30位元 | 24位元 | 保護模式(16位元), IBM PC XT 286, IBM PC AT | |||
第三代 (IA-32)架構 | 1985 | Intel 80386, AMD Am386 (1991) | 32位元 | 46位元 | 32位元 | 32位元 架構(保護模式), 分頁技術,類比8086模式, IBM PS/2 | |
第四代 (管線、快取記憶體) | 1989 | Intel 80486 Cyrix Cx486S/DLC(1992) AMD Am486(1993)/AMD Am5x86(1995) |
管線, 置晶x87 浮點運算器 (486DX), 置晶CPU快取記憶體 | ||||
第五代 (超純量) |
1993 | Intel Pentium, Pentium MMX(1996) | 超純量, 64位元 位址匯流排, 更快的浮點運算器, MMX (Pentium MMX), 進階程式化插斷控制器, 對等多元處理 | ||||
1994 | NexGen Nx586 AMD 5k86/K5 (1996) |
分合式微架構(微作業指令轉換) | |||||
1995 | Cyrix Cx5x86 Cyrix 6x86/MX(1997)/MII(1998) |
脫序超純量執行引擎 | |||||
第六代 (實記憶體位置擴充, 微作業指令轉換) |
1995 | Intel Pentium Pro | 36位元 (PAE) | 微作業指令轉換, 待情形檢索指令, 脫序超純量執行引擎, 推理型執行引擎, 三路x86超純量管線, 超純量浮點運算器, 實記憶體位置擴充, 置片二次元快取 | |||
1997 | Intel Pentium II, Pentium III (1999) Celeron(1998), Xeon(1998) |
置體(Pentium II)或置晶(Celeron)二次元快取, SSE (Pentium III), SLOT 1, Socket 370 or SLOT 2 (Xeon) | |||||
1997 | AMD K6/K6-2(1998)/K6-III(1999) | 32位元 | 3DNow!, 三次元快取系統 (K6-III) | ||||
增強型平台 | 1999 | AMD Athlon, Athlon XP/MP(2001) Duron(2000), Sempron(2004) |
36位元 | MMX+, 3DNow!+, DDR技術引入前端匯流排, Slot A or Socket A | |||
2000 | Transmeta Crusoe | 32位元 | 「變形」CMS技術下的x86平台處理器, VLIW-128核心, 置晶記憶體控制器, 置晶PCI橋控制器 | ||||
Intel Pentium 4 | 36位元 | SSE2, 超執行緒 (Northwood), NetBurst微架構, QDR技術引入前端匯流排, 執行跟蹤快取, Socket 478 | |||||
2003 | Intel Pentium M Intel Core (2006), Pentium Dual-Core (2007) |
微作業指令融合, NX位元 (Dothan) | |||||
Transmeta Efficeon | CMS 6.0.4, VLIW-256, NX位元, HT匯流排 | ||||||
IA-64 | 64位元過渡時代 1999 ~ 2005 |
2001 | Intel Itanium (2001 ~ 2017) | 52位元 | 64位元 EPIC架構, 128位元VLIW指令捆綁, 置晶x86硬體支援x86作業系統和程式(早期版本),軟體IA-32 EL類比x86程式(Itanium 2), Itanium 通用暫存器被對映成x86暫存器 | ||
x64 | 64位元拓展時代 從2001起 |
x64是x86架構的64位元拓展,在它的遺留模式中原封了完整不變的x86架構。x64處理器的真正架構置於64位元模式中,它沒有分段式的定位記憶體能力,因此它僅擁有架構許諾的64位元序列記憶體位置,現時情況僅有48位元被實現;與這個64位元模式共生的是用來支援大部分32位元x86程式的相容模式 | |||||
2003 | Athlon 64/FX/X2(2005), Opteron Sempron(2004)/X2(2008) Turion 64(2005)/X2(2006) |
40位元 | AMD64 (排除早先一些32位元Sempron處理器), 置晶記憶體控制器, HT匯流排, 置晶雙核心(X2), AMD-V (Athlon 64 Orleans), Socket 754/939/940 or AM2 | ||||
2004 | Pentium 4 (Prescott) Celeron D, Pentium D (2005) |
36位元 | EM64T (僅在特定型號的Pentium 4和Celeron D開啟), SSE3, 第二代NetBurst管線, 雙核心(置晶: Pentium D 8xx; 置片: Pentium D 9xx), Intel VT(Pentium 4 6x2), socket LGA 775 | ||||
2006 | Intel Core 2 Pentium Dual-Core (2007) Celeron Dual-Core (2008) |
Intel 64 (<<== EM64T), SSSE3(65奈米), 寬域脫序超純量執行引擎, 微作業指令融合, 巨集融合, 置片四核心(Core 2 Quad), 智慧型分享二次元快取 | |||||
2007 | AMD Phenom/II(2008) Athlon II(2009), Turion II(2009) |
48位元 | Monolithic quad-core(X4)/triple-core(X3), SSE4a, Rapid Virtualization Indexing (RVI), HT匯流排 3, AM2+ or AM3 | ||||
2008 | Intel Core 2 (45奈米) | 36位元 | SSE4.1 | ||||
Intel Atom | 小筆電或低功耗智慧型裝置的處理器, P54C核心的重用 | ||||||
Intel Core i7 Core i5 (2009), Core i3 (2010) |
QuickPath, 置片繪圖及記憶體匯流排 (Clarkdale), SSE4.2, 擴展頁表 (EPT), LGA 1366 (Nehalem) or LGA 1156 socket | ||||||
VIA Nano | 基於硬體的加密元件; 智慧型適應型電源管理 | ||||||
2010 | AMD FX | 48位元 | 八核心, CMT(叢集多執行緒), 乘積累加運算, OpenCL, AM3+ | ||||
2011 | AMD APU A and E Series (Llano) | 40位元 | 置晶GPGPU, PCI Express 2.0, Socket FM1 | ||||
AMD APU C, E and Z Series (Bobcat) | 36位元 | 低功耗智慧型裝置APU | |||||
Intel Core i3, Core i5 and Core i7 (Sandy Bridge/Ivy Bridge) |
內部環形連接, LGA 1155 socket. | ||||||
2012 | AMD APU A Series (Bulldozer, Trinity and later) | 48位元 | AVX, Bulldozer based APU, Socket FM2 or Socket FM2+ | ||||
Intel Xeon Phi (Knights Corner) | 48位元 | 輔助處理器作業系統支撐的PCI-E介面卡形式的XEON系統的輔助處理器, 多異核心晶片, 順序P54C, 超寬VPU (512位元 SSE), LRBni 指令(8× 64位元) | |||||
2013 | AMD Jaguar (Athlon, Sempron) |
48位元 | SoC, 適用於電子遊樂器和低功耗智慧型裝置的處理器 | ||||
Intel Silvermont (Atom, Celeron, Pentium) |
36位元 | SoC, 低或極低功耗智慧型裝置的處理器 | |||||
Intel Core i3, Core i5 and Core i7 (Haswell/Broadwell) | 39位元 | AVX2, FMA3, TSX, BMI1, and BMI2 instructions, LGA 1150 socket | |||||
2015 | Intel Broadwell-U (Intel Core i3, Core i5, Core i7, Core M, Pentium, Celeron) |
SoC, 置片Broadwell-U PCH-LP (多晶元模組) | |||||
2015/2016 | Intel Skylake/Kaby Lake/Cannonlake (Intel Core i3, Core i5, Core i7) |
46位元 | AVX3 | ||||
2016 | Intel Xeon Phi (Knights Landing) | 48位元 | 孤立啟動型Xeon系統的加速器, 基於Airmont (Atom)核心技術 | ||||
2016 | AMD Bristol Ridge (AMD (Pro) A6/A8/A10/A12) |
48位元 | 置晶FCH, SoC, AM4 socket | ||||
2017 | AMD Ryzen Series/AMD Epyc Series | AMD的多執行緒技術, LGA (4094, Epyc), 置片多晶元, Epyc將取代Opteron產品線 | |||||
軟體類比時代 ARM64 |
2017 | Windows 10 on ARM64 | Microsoft與Qualcomm的合作結晶將Windows 10帶入至基於ARM64的Qualcomm平台,並針對32位元x86程式提供CHPE模擬器有效支援,從版本1709 (16299.15)起 | ||||
CPU紀元朝代 | 面市時間 | 卓越的CPU型號 | 實記憶體位置找尋空間 | 引入功能及註釋 |
設計
編輯x86架構是重要地可變指令長度的CISC(複雜指令集電腦,Complex Instruction Set Computer)。字組(word, 4位元組)長度的記憶體存取允許不對齊記憶體位址,字組是以低位位元組在前的順序儲存在記憶體中。向後相容性及Intel量產製程經常領先業界一直都是在x86架構的發展背後一股驅動力量(設計的需要決定了這項因素而常常導致批評,尤其是來自對手處理器的擁護者和理論界,他們對於一個被廣泛認為是落後設計的架構的持續成功感到不解)。但在較新的微架構中,x86處理器會將常用的x86指令盡全力以硬體線路執行,不常用者則轉換為更像RISC的微指令再予執行,從而獲得可與RISC比擬的超純量效能,而仍然保持向下相容。x86架構的處理器一共有四種執行模式,分別是真實模式,保護模式,系統管理模式以及虛擬V86模式。
在這篇簡短的文章中出現的指令和暫存器助憶符號的名稱,都在Intel檔案中有所指定以及使用在Intel組譯器(Assembler)中(和相容的,比如微軟的MASM、Borland的TASM、CAD-UL的as386等等)。一個以Intel語法指定的指令"mov al, 30h"與AT&T語法的"movb $0x30, %al"相當,都是會被轉譯為兩個位元組的機器碼"B0 30"(十六進制)。你可以發現在這段程式中的"mov"或"al",都是原來的Intel助憶符號。如果我們想要的話,我們可以寫一個組譯器由程式碼move immediate byte hexadecimally encoded 30 into low half of the first register(移動立即值位元十六進制編碼30到第一個暫存器的低半部位),來產生相同的機器碼。然而,傳統上組譯器(Assembler)一直使用Intel的助憶符號。
運作模式
編輯真實模式
編輯在真實模式下,記憶體的存取是被區段開來。為了得到最後20位元的記憶體位址,要將區段的位址往左移動4位元,並且加上偏移的位址。因此,真實模式下總共可以定址的空間是220位元組,或者是1MB,於1979年是相當讓人印象深刻的象徵。在真實模式下有兩種定址模式:near和far。在far模式,區段跟偏移都需要被指定;在near模式,只需要偏移模式被指定,而記憶體區段是由適當的區段暫存器獲得。以資料而言是使用DS暫存器,程式碼是CS暫存器,堆疊是SS暫存器。舉個例子,如果DS是A000h且SI是5677h,DS:SI會指向記憶體的絕對位址DS × 16 + SI = A5677h
在這種架構下,兩對不同的區段/偏移可以指向一個相同的絕對位址。因此如果DS是A111h且SI是4567h,DS:SI會指向跟上一段相同的A5677h。除了異值同址重複性之外,這種架構無法同時一次擁有4個以上的區段。此外,CS、DS和SS是為了程式正確功能而必須的,因此僅僅只有ES可以被用來指向其他的地方。這種模式原本是為了與Intel 8085相容,導致程式設計師永無止盡的痛苦。
除了以上所說的,8086也擁有16-bit的32K(其變種 Intel 8088 是8-bit的64K)輸入輸出空間,以及一個由硬體支援的64K(一個區段)記憶體堆疊。只有words(2位元組)可以被推入到堆疊中。堆疊是由記憶體的上端往下成長,他的底端是由SS:SP指向。有256個中斷,可以由硬體或是軟體同時組成。中斷是可以串連在一起,使用堆疊來儲存返回被中斷的程式位址。
16位元保護模式
編輯Intel 80286可以在不改變任何東西下,支援8086的真實模式16位元軟體,然而它也支援額外的工作模式稱為保護模式,可以將可定址的實體記憶體擴充到16MB,可定址的虛擬記憶體最大到1GB。這是使用節區暫存器來儲存在節區表格中的索引值。處理器中有兩個這樣的表格,分別為GDT和LDT,每一個可以儲存最多8192個節區的描述子,每一個節區可以給予最大到64KB的記憶體存取。節區表格提供一個24位元的基底位址(base address),可以用此基底位址增加想要的偏移量來創造出一個絕對位址。此外,每一個節區可以被賦予四種權限等級中的一種(稱為"rings")。
儘管這個推出的功能是一項進步,但是他們並沒有被廣泛地使用,因為保護模式的作業系統無法執行當時的真實模式軟體。這樣的能力只有在隨後80386處理器的虛擬86模式中出現。
在同時,作業系統比如OS/2嘗試使用類似乒乓的方法,讓處理器在保護和真實模式間切換。這樣都會讓電腦變慢且不安全,像是在真實模式下的程式可以輕易地使電腦當機。OS/2也定義了限制性的程式設計規則允許"Family API"或"bound"程式可以在真實模式或保護模式下執行。然而這是給原本為保護模式下設計的程式有關,反之則不然。保護模式程式並不支援節區選擇子和實體記憶體之間的關係。有時候會錯誤地相信在16位元保護模式下執行真實模式的程式,導致IBM必須選擇使用Intel保留給BIOS的中斷呼叫。事實上這類的程式使用任意的選擇子數值和使用在上面提到的「節區運算」的方式有關。
這個問題也在Windows 3.x上出現。這個推出版本想要在16位元保護模式下執行程式,而先前的版本只能在真實模式下執行。理論上,如果Windows 1.x或2.x程式是寫得「適當」且避免使用節區運算的方式,它就有可能在真實和保護模式兩者下執行。Windows程式一般來說都會避免節區運算,這是因為Windows實作出軟體的虛擬記憶體方式,及當程式不執行時候,搬移記憶體中的程式碼和資料,所以操作絕對位址的方式是很危險的;當程式不執行時,被認為要保持記憶體區塊的「handles」,這樣的handles已經非常相當於保護模式的選擇子。在保護模式下的Windows 3.0執行一個舊的程式,會觸發一個警告對話盒,建議在真實模式下執行Windows(推測還是仍然可以使用擴充記憶體,可能是在80386機器用EMM386類比,因此它並不被局限於640KB)或是從廠商那更新到新的版本。好的行為之程式可能可以使用特別的工具來避免這樣的對話盒。不可能有些GUI程式在16位元保護模式下執行,且其它GUI程式在真實模式執行,可能是因為這會需要兩個分開的環境且會依於前面所提到的處理器在兩個模式間的乒乓效應。從Windows 3.1版開始,真實模式就消失了。
32位元保護模式
編輯Intel 80386推出後,也許是到目前為止x86架構的最大躍進。除了需要值得注意的Intel 80386SX是32位元架構但僅只有24位元定址(和16位元資料匯流排)。除此之外其他架構都是32位元 - 所有的暫存器、指令集、輸出輸入空間和記憶體定址。為了能夠在後者所說的功能工作,要使用32位元擴充的保護模式。然而不像286,386所有的區段可以使用32位元的偏移量,即使記憶體空間有使用區段,但也允許應用程式存取超過4GB空間而不需要區段的分隔。此外,32位元保護模式提供分頁的支援,是一種讓虛擬記憶體得以實現的機制。
沒有新的通用暫存器被加入。所有16位元的暫存器除了區段暫存器外都擴充為32位元。Intel在暫存器的助記符號上加入「E」來表示(因此擴充的AX變成EAX,SI變成ESI,依此類推)。因為有更多的暫存器數量、指令、和運算單元,因此機器碼的格式也被擴充。為了提供與先前的架構相容,包含執行碼的區段可以被標示為16或是32位元的指令集。此外,特殊的前置符號也可以用來在16位元的區段包含32位元的指令碼,反之亦然。
分頁跟區段的記憶體存取是為了支援現在多工作業系統所必須要的。Linux、386BSD、Windows NT和Windows 95都是一開始為386所發展,因為它是第一顆提供可靠地程式分離記憶體空間的支援(每個程式擁有自己的定址空間)以及可以在必要的情況下打斷他們程式的執行(使用ring,一種x86保護模式下權力分級的名稱)。這種386的基本架構變成未來所有x86系列發展的基礎。
Intel 80386數學輔助運算處理器也在整合到這個CPU之後的x86系列中,也就是Intel 80486。新的FPU可以幫助浮點數運算,對於科學計算和圖形設計是非常重要。
Intel首次在80386SL將系統管理模式引入x86體系結構。
虛擬86模式
編輯功能擴充
編輯MMX
編輯1996年Intel的MMX(AMD認為這是矩陣數學擴充Matrix Math Extensions的縮寫,但大多數時候都被當成Multi-Media Extension,而Intel從來沒有官方宣布過詞源)技術出現。儘管這項新的科技得到廣泛宣傳,但它的精髓是非常簡單的:MMX定義了八個64位元SIMD暫存器,與Intel Pentium處理器的FPU堆疊有相重疊。不幸的是,這些指令無法非常簡單地對應到由原來C編譯器所產生的指令碼中。MMX也只局限於整數的運算。這項技術的缺點導致MMX在它早期的存在有輕微的影響。現今,MMX通常是用在某些2D影片應用程式中。
3DNow!
編輯1997年AMD推出3DNow!,是對於MMX的SIMD的浮點指令增強(針對相同的MMX暫存器)。儘管這些也沒有解決編譯器的難題,但這項技術的推出符合了PC上的3D休閒娛樂應用程式之崛起。3D遊戲開發者和3D繪圖硬體製造商在AMD的AMD K6和Athlon系列處理器上,使用3DNow!來幫助增加他們的效能。微軟後來也在其開發的Direct X7.0中加入針對3DNow!的最佳化,使當時的Athlon處理器在3D遊戲效能上首次全面超過對手英特爾的Pentium 3處理器。
SSE
編輯在1999年Intel推出SSE指令集,增加了八個新的128-bit暫存器(不跟其他的暫存器重疊使用)。這些指令類似於AMD的3DNow!,主要是增加浮點數運算的SIMD指令。
SSE2
編輯2001年英特爾推出SSE2指令集,增加了:
- 完整地補充了整數指令(與MMX相似)到原來的SSE暫存器。
- 64位元的SIMD浮點運算指令到原來的SSE暫存器。
第一個的增加導致MMX幾乎是過時可以捨棄的,第二個則允許這些指令可以讓傳統的編譯器現實地產生。
SSE3
編輯於2004年隨著Pentium 4處理器的改版Prescott核心推出。SSE3增加特定的記憶體和thread-handling指令來提升Intel超執行緒的效能,在科學計算方面也有增強。
SSE4
編輯2007年1月,Intel公開發表使用其45奈米製程"Penryn"晶片家族的PC和伺服器。"Penryn"是這一系列依據英代爾Core微架構之筆記型電腦、桌上型電腦和伺服器晶片家族的代號,首次正式發布時共有16款處理器,除了一款Intel Core 2 Extreme QX9650是針對普通桌上型電腦市場外,其餘的雙核Xeon 5200系列和四核5400系列都是伺服器處理器。基本上Penryn是繼Merom之後的縮小版Core 2 Duo,再加上47條新的SSE4指令集等額外配備。SSE4指令集之首次發表時間為2006年9月的英特爾開發者論壇(IDF,Intel Developer Forum)。
另外,x86處理器製造廠商AMD也在該公司K10架構的Phenom處理器中,加入4條新的SSE4A指令集。注意,SSE4與SSE4A無法彼此相容。
AVX
編輯FMA
編輯AES
編輯SHA
編輯定址模式
編輯定址模式在16-bit的x86處理器:
32-bit定址模式在32-bit或64-bit的x86處理器:
64-bit定址模式在64-bit的x86處理器:
x86組譯指令lea,是Load Effective Address的縮寫,其優勢是:
- LEA指令具有單時鐘周期,執行效率很高。
- 是CPU位址生成單元參與運算的,而不是ALU參與運算的,所以在管線上不會與上下文的算術邏輯指令產生流水相關
- INTEL指令集中不存在很多RISC機器所具有的三運算元算術運算指令,比如像ARM的"add r0,r1,r2",而LEA指令恰好提供了同樣的功能,以類比「三元算術邏輯指令」。例如:lea ebx ,[eax+edx]
- 在組合語言程式設計中,在需要取得一個變數位址時,使用lea是很方便的。而mov指令則常常出錯,因為在微軟MASM組譯語法中,label和variable是不同的:addr不可前向參照,offset則能;addr可以處理局部變數而 offset則不能。
x86暫存器
編輯16位元
編輯自Intel 8086和8088起,有14個16位元暫存器。其中四個(AX, BX, CX, DX)是通用目的(儘管每個暫存器都有附加目的;舉個例子:只有CX可以被用來當作loop(迴圈)指令的計數器。)每個暫存器可以被當成兩個分開的位元組存取(因此BX的高位元可以被當成BH,低位元則可以當成BL)。除了這些暫存器,還有四個區段暫存器(CS、DS、SS、ES)。他們用來產生記憶體的絕對位址。還有兩個指標暫存器(SP是指向堆疊的底部,BP可以用來指向堆疊或記憶體的其它地方)。兩個指標暫存器(SI和DI)可以用來指向陣列的內部。最後,有旗標暫存器(包含狀態旗標比如進位、溢位、結果為零,等等)。以及IP是用來指向目前執行指令的位址。
32位元
編輯自Intel 80386起,四個通用暫存器(EAX, EBX, ECX, EDX),它們較低的16位元分別與原本16位元的通用暫存器(AX, BX, CX, DX)重疊共享。指標暫存器(EIP, EBP, ESP, ESI, EDI)。區段暫存器除了原本的(CS、DS、SS、ES),另外新增(FS、GS),但是區段暫存器在32位元模式下改做為記憶體區塊的選擇子暫存器。旗標暫存器被擴展為32位元,較低的16位元與原本在16位元下的旗標暫存器重疊共享。
64位元
編輯MMX暫存器(MM0~MM7),它們分別與浮點運算器〈FP0~FP7〉相重疊,所以MMX與浮點運算不可同時使用,必須透過切換選擇要使用哪一種。
AMD64
編輯英特爾原本已經決定在64位元的世代推出新的架構IA-64技術的Itanium處理器產品線來接替取代x86,但它與x86的軟體天生不相容,因此藉以各種形式來執行x86的軟體,不過,效率十分低下,加之處理器本身和軟體移植的成本難以控制,因此這個計畫最終告吹。
AMD自行把32位元x86(或稱為IA-32)拓展為64位元,並命名為x86-64或Hammer架構,而後更名為AMD64架構,並曾禁止使用之前的名字來稱呼這一架構[1]。以這個技術為基礎的第一個產品是單核心的Opteron和Athlon 64處理器家族。由於AMD的64位元處理器產品線首先進入市場,且微軟也不願意為英代爾代號為Yamhill的64位元版x86處理器開發第三個不同的64位元作業系統,英代爾被迫採納AMD64架構且增加某些新的擴充到他們自己的產品,命名為EM64T架構(顯然他們不想承認這些指令集是來自它的主要對手),EM64T後來被英代爾正式更名為Intel 64。
這個架構也被稱為 64位元拓展架構,即x64,譬如四個通用暫存器(RAX, RBX, RCX, RDX)是由32位元的(EAX, EBX, ECX, EDX)64位元擴展而來,相應的還有 指標暫存器(RIP, RBP, RSP, RSI, RDI),以及增加八個通用暫存器(R8~R15)等等。 這些資源只可在x64處理器的64位元模式下使用,在用來支援x86軟體的遺留模式和相容模式中是不可見的。
128位元
編輯256位元
編輯SIMD registers YMM0 - YMM15.
512位元
編輯SIMD registers ZMM0 - ZMM31.
暫存器結構
編輯64 | 56 | 48 | 40 | 32 | 24 | 16 | 8 |
---|---|---|---|---|---|---|---|
R?X | |||||||
E?X | |||||||
?X | |||||||
?H | ?L |
64 | 56 | 48 | 40 | 32 | 24 | 16 | 8 |
---|---|---|---|---|---|---|---|
? | |||||||
?D | |||||||
?W | |||||||
?B |
16 | 8 |
---|---|
?S |
64 | 56 | 48 | 40 | 32 | 24 | 16 | 8 |
---|---|---|---|---|---|---|---|
R?P | |||||||
E?P | |||||||
?P | |||||||
?PL |
Note: The ?PL registers are only available in 64-bit mode.
64 | 56 | 48 | 40 | 32 | 24 | 16 | 8 |
---|---|---|---|---|---|---|---|
R?I | |||||||
E?I | |||||||
?I | |||||||
?IL |
Note: The ?IL registers are only available in 64-bit mode.
64 | 56 | 48 | 40 | 32 | 24 | 16 | 8 |
---|---|---|---|---|---|---|---|
RIP | |||||||
EIP | |||||||
IP |
虛擬化
編輯Intel CPU的x86虛擬化技術有VT-x、VT-d等。AMD CPU的x86虛擬化技術有AMD-V等。
x86指令格式
編輯x86與x86-64指令集的指令的格式為:
指令字首 | 指令碼 | ModR/M | SIB | 偏移 | 直接數 |
---|---|---|---|---|---|
Instruction Prefixes | Opcode | Displacement | Immediate | ||
可選。 最多4個單位元組字首。 任何順序均可。 |
單位元組、雙位元組、三位元組 | 按需。 0-2位:R/M 3-5位:Reg/Opcode 6-7位:Mod |
按需。 0-2位:Base 3-5位:Index 6-7位:Scale |
0、1、2、4位元組長 | 0、1、2、4位元組長 |
指令字首
編輯分為4組,每組用1個位元組編碼。每組在指令中至多指定1個字首值。4組的順序可以任意。
- 第1組鎖與重複(Lock and repeat)
- 鎖(LOCK)編碼為:F0H。用於互斥訪問共享主記憶體的操作。
- 非零時重複(REPNE/REPNZ)編碼為:F2H。用於字串操作指令。
- 為零時重複(REP/REPE/REPZ)編碼為:F3H。用於字串操作指令。
- 第2組
- 段覆蓋(Segment override):CS、SS、DS、ES、FS、GS的段覆蓋字首的編碼分別是2EH、36H、3EH、26H、64H、65H.
- 分支提示(Branch hints),用於條件分支指令Jcc。提示分支不發生編碼為2EH;提示分支發生編碼為3EH。
- 第3組運算元長度覆蓋(Operand-size override)編碼為66H。用於在16位元與32位元運算元切換。
- 第4組位址長度覆蓋(Address-size override)編碼為67H.用於在16位元與32位元位址切換。
指令碼
編輯長度為1、2或3位元組,此外ModR/M中還可能有3位。對於雙位元組指令碼或三位元組指令碼,其中的第1個位元組為0FH,用於與指令字首區分。
ModR/M與SIB
編輯許多指令的主記憶體運算元需要使用ModR/M位元組作為定址模式說明符。其中的mod與r/m組合,共有32個值,表示8個暫存器與24種定址模式。reg/opcode表示暫存器號或者額外的3位指令碼,其具體含義依賴基本指令碼。Mod與R/M的5位表示的第一運算元(源與目的運算元中定址方式更複雜的那個運算元,指令碼中的「方向位」direction bit(d)給出源或目的運算元哪個是第一運算元)的定址方式如下:
定址方式 | Mod | R/M |
---|---|---|
[EAX] | 00 | 000 |
[ECX] | 001 | |
[EDX] | 002 | |
[EBX] | 003 | |
[--][--] | 004 | |
disp32 | 005 | |
[ESI] | 006 | |
[EDI] | 007 | |
[EAX]+disp8 | 01 | 000 |
[ECX]+disp8 | 001 | |
[EDX]+disp8 | 002 | |
[EBX]+disp8 | 003 | |
[--][--]+disp8 | 004 | |
[EBP]+disp8 | 005 | |
[ESI]+disp8 | 006 | |
[EDI]+disp8 | 007 | |
[EAX]+disp32 | 10 | 000 |
[ECX]+disp32 | 001 | |
[EDX]+disp32 | 002 | |
[EBX]+disp32 | 003 | |
[--][--]+disp32 | 004 | |
[EBP]+disp32 | 005 | |
[ESI]+disp32 | 006 | |
[EDI]+disp32 | 007 | |
EAX/AX/AL/MM0/XMM0 | 11 | 000 |
ECX/CX/CL/MM/XMM1 | 001 | |
EDX/DX/DL/MM2/XMM2 | 002 | |
EBX/BX/BL/MM3/XMM3 | 003 | |
ESP/SP/AH/MM4/XMM4 | 004 | |
EBP/BP/CH/MM5/XMM5 | 005 | |
ESI/SI/DH/MM6/XMM6 | 006 | |
EDI/DI/BH/MM7/XMM7 | 007 | |
1.[--][--]表示隨後的SIB位元組指明定址方式; 2.Mod為11B時,表示暫存器運算元。對於R/M的每個值,根據指令碼與運算元長度屬性確定具體的暫存器號。 3.當指令需要第2運算元時,由Reg/Opcode的3位給出。第2運算元只能是暫存器運算元。暫存器的指定方式,與Mod為11B時指定作為第1運算元的暫存器的方式完全相同。 |
某些ModR/M位元組表示的尋找模式,需要SIB位元組來補充定址方式。scale表示比例係數;index表示變址暫存器號;base表示基址暫存器號。使用scale與index的5位定義比例變址暫存器如下:
比例變址 | Scale | Index |
---|---|---|
[EAX] | 00 | 000 |
[ECX] | 001 | |
[EDX] | 002 | |
[EBX] | 003 | |
無 | 004 | |
[EBP] | 005 | |
[ESI] | 006 | |
[EDI] | 007 | |
[EAX*2] | 01 | 000 |
[ECX*2] | 001 | |
[EDX*2] | 002 | |
[EBX*2] | 003 | |
無 | 004 | |
[EBP*2] | 005 | |
[ESI*2] | 006 | |
[EDI*2] | 007 | |
[EAX*4] | 10 | 000 |
[ECX*4] | 001 | |
[EDX*4] | 002 | |
[EBX*4] | 003 | |
無 | 004 | |
[EBP*4] | 005 | |
[ESI*4] | 006 | |
[EDI*4] | 007 | |
[EAX*8] | 11 | 000 |
[ECX*8] | 001 | |
[EDX*8] | 002 | |
[EBX*8] | 003 | |
無 | 004 | |
[EBP*8] | 005 | |
[ESI*8] | 006 | |
[EDI*8] | 007 |
3位base表示的基址暫存器號,定義如下:
EAX | ECX | EDX | EBX | ESP | [*] | ESI | EDI |
---|---|---|---|---|---|---|---|
000 | 001 | 002 | 003 | 004 | 005 | 006 | 007 |
[*]有兩種含義:1.如果Mod為00B,則[scaled index] + disp32,即沒有基址暫存器。 2.如果Mod為01B或10B,表示基址暫存器為EBP。 |
在組譯程式設計中,一般把第1運算元的定址方式總結為如下8種:
定址方式 | 英文術語 | 舉例 |
---|---|---|
立即(數)定址 | immediate addressing | mov EAX, 01F2H |
暫存器定址 | register addressing | mov EAX, ESI |
直接定址 | direct addressing | mov EAX, DWORD PTR [1FFA00H] |
暫存器間接定址 | register indirect addressing | mov EAX, DWORD PTR [EBX] |
基址加變址定址 | base-plus-index addressing | mov EAX, DWORD PTR [EBX+ESI] |
暫存器相對定址 或基址相對定址 |
register relative addressing | mov EAX, DWORD PTR [EDI+01F4H] |
基址相對加變址定址 | base relative-plus-index addressing | mov EAX, DWORD PTR 01F4H[EDI+EBX] |
比例變址定址 | scaled-index addressing | mov EAX, DWORD PTR 01F4H[EDI*8+EBX] |
綜合指令格式中的ModR/M與SIB兩個位元組的語意規定,指令的第1運算元的定址方式可總結為4種物理實現:
- 立即數:表示在指令的「立即數」部分。包括了直接定址,即立即數作為主記憶體的位址。
- 暫存器運算元:Mod為11B,根據R/B部分的值、指令碼、運算元長度屬性,確定具體的暫存器號。
- 基址相對定址:即[Reg+disp8或disp32]。包括了暫存器間接定址。這種情況計算第1運算元位址時使用了1個暫存器。
- 基址加比例變址的相對定址:即[BaseReg+IndexReg*scale+disp8或disp32]。這種情況計算第1運算元位址時使用了2個暫存器。
位移與立即數
編輯某些定址方式需要給出位移值。有些指令需要給出立即數作為運算元。
生產商
編輯目前仍在設計、生產並販賣x86處理器的公司包括:
曾經設計、生產並販賣x86處理器,但現已退出x86處理器市場的公司包括:
參考文獻
編輯- ^ Rust, Adamson. AMD bans use of Hammer word, X86-64. The Inquirer. 2003-04-24 [2010-10-30]. (原始內容存檔於2009-10-12).