Intel 8086

Intel 8086中而被人知曉。8086是Intel最成功的處理器系列x86架構的開端。歷史.背景.1972年，Intel釋出了8008微處理器——世界上第一款8位微處理器。 8008微處理器有18個引腳，其中地址匯流排使用了14個引腳，並且與8位資料匯流排複用引腳。指令集源自是Datapoint公司為計算機的CRT-鍵盤終端設計的但相當通用的指令集。當時英特爾還是一家生產DRAM為主業的公司，缺乏這方面的技術儲備。1974年，Intel釋出了8080微處理器， 被公認是第一款真正可用的微處理器。8080的晶片封裝採用40個引腳，其中8個數據匯流排引腳、16個地址匯流排引腳都是專用的，因此資料匯流排與地址匯流排可以並行工作。8080的擴充套件後的指令集在原始碼級別上向前相容8008指令集。1975年，Intel釋出了第三款8位微處理器——8085。採用了新的製造工藝，簡化了輸入電壓引腳的數量。同一時期還有Motorola 6800等8位微處理器。在8位微處理器市場競爭中Z80最為成功。第一種x86設計.8086專案起始於1976年5月，是英特爾公司當時更為看重的16位元的微處理器的備份專案。8086一方面要與Motorola, Zilog, National Semiconductor等公司的16位元、32位元微處理器競爭-{zh-tw:市佔率;zh-cn:市場份額}-，另一方面也是對Zilog Z80在8位元位微處理器市場上的成功的回擊。由於採用了與8085微處理器近似的微體系結構與物理實現工藝-{zh-tw:製程;zh-cn:物理實現工藝}-，8086專案進展相當快。8086微處理器被設計為在彙編源程式上向前相容8008, 8080, 8085等微處理器。指令集與程式設計模式是基於8080微處理器，但指令集做了擴充以完全支援16位元-{zh-tw:運算;zh-cn:計算}-。新增加的指令包括：完全支援有符號整數、段基址+偏移量定址、類似於Z80的自重複操作、直接支援巢狀的ALGOL類語言如Pascal或PL/M、微碼實現的乘法除法指令、以及更好支援與協處理器和多處理器系統的匯流排結構。第一版的指令集與高層的體系結構的設計僅用了3個月。 在沒有CAD工具的時代，4名工程師與12名佈線繪圖員平行工作， 用了2年多的時間才把8086的高層設計實現為可執行測試的產品。這在當時算是很快的研發速度。8086是隨機邏輯與微碼的混合實現，使用了大約20,000個電晶體。芯片面積為33 mm²，-{zh-tw:製程;zh-cn:製造工藝}-為3.2 μm.8086體系結構由Stephen P. Morse設計，並在最後定案時得到Bruce Ravenel的幫助。邏輯設計者是以Jim McKevitt與John Bayliss為首的硬體開發工程師團隊。專案經理William Pohlman。迄今8086的指令集仍然是-{zh-tw:個人電腦;zh-cn:PC機}-與伺服器的基本指令集。細節.匯流排與操作.所有的內部暫存器、內部及外部資料匯流排都是16位寬，因此是完全的16位微處理器。20位外部地址匯流排，因此物理定址空間為1MiB (即220 = 1,048,576).由於內部暫存器都是16位，對1M地址空間定址時採取了段定址方式。8086的封裝採用40引腳的雙列直插。直到32位的80386出現之前，8086的這種段定址相當不便.8086晶片封裝的8個控制引腳在"min"或"max"下有不同功能。"min"模式是使用單處理器的小型計算機系統，"max"模式是使用多處理器的中到大型計算機系統。暫存器與指令.8086有8個16位元的暫存器，包括棧暫存器SP與BP，但不包括指令暫存器IP、控制暫存器FLAGS以及四個段暫存器。AX, BX, CX, DX,這四個暫存器可以按照位元組訪問；但BP, SI, DI, SP,這四個地址暫存器只能按照16位寬訪問。8086以8080和8085。8086有四個完全一樣的16位元暫存器，但也能夠當作八個8位元暫存器來存取；以及四個16位元索引暫存器埠，以及固定的向量中斷。大部分的指令只能夠存取一個記憶體位址，所以其中一個運運算元必須是一個暫存器。運算結果會儲存在運運算元中的一個。8086有4個記憶體區段使用變得困難。它降低了指標的高效率，且有可能產生兩個指向同一個地方的指標擁有不同的位址。更壞的是，這種方式產生要讓記憶體擴充到大於1MB的困難。而80286的定址方式改變讓記憶體擴充較有效率。由於8位機。相比與8080或8085，8086有更強的暫存器通用性，但比起典型的小型計算機來說仍有很大不如。8086的某些指令隱式使用某些暫存器。比起更為規則的16- 或32-位處理器如PDP-11, VAX, 68000,等等，8086的暫存器分配特性使得編譯器的工作更為複雜;另一方面，比起半現代化的但廣為使用的8位微處理器如6502, 6809,或8085,編譯器生成程式碼就容易太多了.8086有64 KiB的字寬為8位的I/O定址空間.棧的長度最大為64 KB ，8086硬體支援棧頂由高地址向低地址生長。入棧、彈棧的資料單元長度為2位元組。棧頂位置由暫存器的組合SS:SP給出.共有256 箇中斷,包括硬體中斷與軟中斷。中斷可以巢狀，使用棧來儲存中斷返回地址。8086增加了一些8080與8085所沒有的新指令，用於更好地支援Pascal與PL/M的高階程式設計特性;如push "mem-op", ret "size", (其它一些指令如push "immed" and enter,在隨後的80186, 80286, and 80386中陸續增加.)標誌暫存器.8086有一個16位寬的標誌暫存器FLAGS.其中9個位元是被使用的，另外7個位元保留未用。具體是：進位標誌CF、奇偶標誌PF、輔助標誌AF、為零標誌ZF、符號標誌SF、追蹤標誌TF、中斷允許標誌IF、方向標誌DF、溢位標誌OF。記憶體分段.在Intel的8位、16位處理器中，由於暫存器的寬度為8或16位元，而地址匯流排的寬度一般是要大於暫存器的寬度，所以為了能訪問整個地址空間，需要採取特殊的定址計算——分段定址。從80386開始的32位微處理器，地址匯流排寬度也是32位元，可以視作扁平地址空間，不再需要分段定址。8086的分段定址，是指一個物理地址由段地址與偏移量相加即為物理地址。例如，06EFh:1234h，表示段地址為06EFh,偏移量為1234h,物理地址為06EF0h + 1234h = 08124h。在計算物理地址時如果發生上溢位，8086處理器捨棄進位。例如，FFFFh：0010h所對應的物理地址為00000h.一個20位的物理地址對應著4096個不同的"段地址：偏移量"的組合。這是因為，偏移量的最低4位對應於物理地址的最低四位，而偏移量的高12位共有4096個取值。段地址所對應的物理地址的粒度是16位元組，稱之為paragraph。段地址確定後，偏移量的取值最多為64KiB。8086處理器有20根地址匯流排引腳，因此物理記憶體空間最大為220=1MiB=1,048,576位元組。這還包括了IO記憶體。因此使用8086處理器的計算機的主存的容量少於1MiB，最常見的主存容量是640KiB。由於X86指令集的向後相容原則，計算物理地址時，段地址左移4位被所有後繼支援真實模式的X86處理器所繼承。80286是使用24位寬地址匯流排的16位微處理器，如果要在整個224=16MiB物理儲存空間定址，就必須採用其它方式，即保護模式定址，這時16位的段地址是指向段描述符表的一個包含24位基地址的條目，基地址加上16位偏移量即為24位的物理地址。在8086上執行的編譯器，一般支援兩種C語言的指標：近指標，類似於遠指標。但巨指標的地址運算是線性20位；而遠指標的地址運算在16位偏移值溢位時不影響段地址部分，因此遠指標的線性部分是16位。為了避免對大量的指標、資料結構、函式指出是“近”還是“遠”，編譯器提供了記憶體模式給出了預設的記憶體訪問方式：預編譯庫對不同的記憶體模式要分別編譯為相應版本。移植老的程式.8位機上的程式可以不考慮段地址直接以.com可執行檔案以“微模式”在8086上執行。這是當時8086與MS-DOS作為新平臺取得市場成功的關鍵原因——大量已存的CP/M應用程式能很快得到利用。例項程式碼.以下8086/8088彙編原始碼是將給定大小的資料塊從一個位置複製到另一個位置的叫做codice_1的子程式。每次複製一個位元組，資料移動和迴圈邏輯採用16位操作。上面的程式碼使用BP。這種呼叫約定支援可重入和遞迴程式碼，大多數類ALGOL語言上世紀50年代後期就已採用這種約定。ES段暫存器儲存在堆疊上，並用DS段暫存器中的值替換，於是指令 會在相同的源資料段和目的資料段之間操作。在返回前，子程式恢復了ES暫存器以前的值。上面的子程式是一種比較麻煩的複製成塊資料的方法。若源資料區域和目的資料區域都是處於單個65,536位元組的段中，使用8086的塊codice_2指令更有優勢。上面的迴圈部分可以替換為：這種方法每次可以複製一個字。codice_3指令使下面的codice_4重複直至CX=0，重複之時自動遞增SI和DI。另外，codice_5或codice_6指令可以用來一次複製單個位元組或雙字。大多數彙編器在codice_3指令用在codice_4之前為codice_9的情況下都會正確彙編。如果被中斷，這個程式也能正確執行，因為程式計數器會繼續指向codice_3指令，知道塊複製已經結束。複製會在中斷服務程式將控制恢復的時候繼續。效能.外部匯流排作為資料與地址的複用，降低了CPU的效能。取16位元或8位元資料需要4個時鐘週期。指令的長度為1-6個位元組，取指令與執行是併發完成的。CPU內的匯流排介面單元把取到的指令儲存在6位元組的預取佇列中。8086涉及記憶體訪問的指令，包括跳轉指令需要比8080與8085更多的時間，原因在於：8086的後繼處理器的記憶體訪問效能大大增強了。80186與80286有專門的地址計算硬體，節約了很多時間週期。80286的外部地址匯流排與資料匯流排是分開各自專用的。浮點.8086/8088可以連線上專用的數學協處理器以增加浮點計算效能。標準的數學協處理是Intel 8087，執行80位浮點數運算。使用8086的微電腦.第一個以8086為基礎的商業微電腦是Mycron2000。IBM Displaywriter文書處理機也使用8086。在大部分顯要的所有微處理器中，IBM PC使用了更窄的記憶體匯流排版本的8086，也就是Intel 8088。8086CPU結構上的一個重要特點是分為二大部分，即匯流排介面單元BIU和執行單元EU，其中BIU負責外部資訊交換，EU負責指令執行，二者合理分工、並行工作，工作效率比此前的CPU明顯提高，常稱之為流水線結構。硬體模式.8086和8088支援兩種硬體模式：最大模式和最小模式。最大模式是用在大型應用中的多重處理，並且也是支援8087處理器的必需。該模式通常硬體化在電路中，不能由軟體改變。具體來說，#33引腳紀念.2018年6月8日，英特爾在官網上開啟了限量抽獎活動，獎品為i7-8086k，限量生產8086個。"Article based on Intel 8086 at FOLDOC，used with permission."