8086
8086
Intel 8086是一個由Intel於1978年所設計的16位微處理器晶元,是x86架構的鼻祖。不久之後,Intel 就推出了 Intel 8088 (一個擁有8根外部數據匯流排的微處理器)。它是以8080和8085的設計為基礎,擁有類似的寄存器組,但是數據匯流排擴充為16位。匯流排介面單元(Bus Interface Unit)透過6位元組預存(prefecth) 的隊列(queue)位指令給執行單元(Execution Unit),所以取指令和執行是同步的,8086 CPU有20條地址線,可直接定址1MB的存儲空間,每一個存儲單元可以存放一個位元組(8位)二進位信息。
Intel 8086擁有四個16位的通用寄存器,也能夠當作八個8位寄存器來存取,以及四個16位索引寄存器(包含了堆棧指標)。資料寄存器通常由指令隱含地使用,針對暫存值需要複雜的寄存器配置。它提供64K 8 位元的輸出輸入(或32K 16 位元),以及固定的向量中斷。大部分的指令只能夠存取一個內存位址,所以其中一個操作數必須是一個寄存器。運算結果會儲存在操作數中的一個寄存器。
Intel 8086有四個 內存區段(segment)寄存器,可以從索引寄存器來設定。區段寄存器可以讓 CPU 利用特殊的方式存取1 MB內存。8086 把段地址左移 4 位然後把它加上偏移地址。大部分的人都認為這是一個很不好的設計,因為這樣的結果是會讓各分段有重疊。儘管這樣對組合語言而言大部分被接受(也甚至有用),可以完全地控制分段,使在編程中使用指針(如C編程語言)變得困難。它導致指針的高效率表示變得困難,且有可能產生兩個指向同一個地方的指針擁有不同的地址。更壞的是,這種方式產生要讓內存擴充到大於 1 MB 的困難。而 8086 的定址方式改變讓內存擴充較有效率。
8086處理器的時鐘頻率介於4.77MHz(在原先的IBM PC頻率)和10 MHz之間。8086 沒有包含浮點指令部分(FPU),但是可以通過外接數學輔助處理器來增強浮點計算能力。Intel 8087 是標準版本。
i8086處理器
8086有16根數據線和20根地址線,它既能處理16位數據,也能處理8位數據。可定址的內存空間為1MB。
在取得IBM個人電腦部門敲定的重要銷售合約之後,Intel 8088處理器不僅成為了IBM個人電腦的大腦,而且還讓IBM個人電腦成為新款暢銷產品。為此,Intel 8088處理器的成功,也將英特爾進入“財富雜誌500大企業排行榜”,《財富》雜誌將英特爾評為“70年代最成功的企業”之一。Intel 8088晶體管數目約為2.9萬顆。
1978年英特爾公司生產的8086是第一個16位的微處理器。很快Zilog公司和摩托羅拉公司也宣布計劃生產Z8000和68000。這就是第三代微處理器的起點。
8086微處理器最高主頻速度為8MHz,具有16位數據通道,內存定址能力為1MB。同時,英特爾還生產出與之相配合的數學協處理器i8087,這兩種晶元使用相互兼容的指令集,但intel8087指令集中增加了一些專門用於對數、指數和三角函數等數學計算的指令。人們將這些指令集統一稱之為 x86指令集。雖然以後英特爾又陸續生產出第二代、第三代等更先進和更快的新型CPU,但都仍然兼容原來的x86指令,而且英特爾在後續CPU的命名上沿用了原先的x86序列,直到後來因商標註冊問題,才放棄了繼續用阿拉伯數字命名。
1979年,英特爾公司又開發出了8088。8086和8088在晶元內部均採用16位數據傳輸,所以都稱為16位微處理器,但8086每周期能傳送或接收16位數據,而8088每周期只能傳輸8位。因為最初的大部分設備和晶元是8位的,而8088的外部8位的數據傳送、接收能與這些設備相兼容。8088採用40針的DIP封裝,工作頻率為6.66MHz、7.16MHz或8MHz,微處理器集成了大約29000個晶體管。
8086和8088問世后不久,英特爾公司就開始對他們進行改進。他們將更多功能集成在晶元上,這樣就誕生了80186和80188。這兩款微處理器內部均以16位工作,在外部輸入輸出上80186採用16位,而80188和8088一樣是採用8位工作。
1981年,IBM公司將8088晶元用於其研製的PC機中,從而開創了全新的微機時代。也正是從8088開始,個人電腦(PC)的概念開始在全世界範圍內發展起來。從8088應用到IBM PC機上開始,個人電腦真正走進了人們的工作和生活之中,它也標誌著一個新時代的開始
匯流排介面單元 (BIU bus interface unit)
匯流排介面單元BIU
⑴4個段地址寄存器:
CS(code segment)——16位的代碼段寄存器;
DS(data segment)——16位的數據段寄存器;
ES(extra segment)——16位的擴展段寄存器;
SS(stack segment)——16位的堆棧段寄存器;
⑵16位的指令指針寄存器IP;
⑶20位的地址加法器;
⑷6位元組的指令隊列緩衝器。
執行單元
執行部件由下列幾個部分組成:
⑴8個通用寄存器:即AX、BX、CX、DX,BP,SP,SI,DI ;
其中,4個數據寄存器:AX、BX、CX、DX;
2個地址指針寄存器:BP(base pointer),SP(stack pointer);
2個變址寄存器:SI(source index),DI(destination index);
⑵標誌寄存器FR(flags register);
⑶算術邏輯單元ALU(arithmetic logic unit)。
EU負責全部指令的執行,同時向BIU輸出數據(操作結果),並對寄存器和標誌寄存器進行管理。在ALU中進行16位運算,數據傳送和處理均在EU控制下執行。
BIU和EU的管理
8086cpu結構圖
⑵ EU執行指令時,從指令隊列頭部取指令,然後執行。如需訪問存儲器,則EU向BIU發出請求,由BIU訪問存儲器。
⑶ 在執行轉移、調用、返回指令時,需改變隊列中的指令,要等新指令裝入隊列中后,EU才繼續執行指令。
概念
8086CPU引腳圖
當CPU處於不同工作模式時,其部分引腳的功能是不同的。
與之功能相同的
⑴AD15 ~AD0(address data bus):地址/數據匯流排,雙向,三態。
這是一組採用分時的方法傳送地址或數據的復用引腳。根據不同時鐘周期的要求,決定當前是傳送要訪問的存儲單元或I/O埠的低16位地址,還是傳送16位數據,或是處於高阻狀態。
⑵A19/S6~A16/S3(address/status):地址/狀態信號,輸出,三態。
這是採用分時的方法傳送地址或狀態的復用引腳。其中A19~A16為20位地址匯流排的高4位地址,S6~S3是狀態信號。S6表示CPU與匯流排連接的情況,S5指示當前中斷允許標誌IF的狀態。S4,S3的代碼組合用來指明當前正在使用的段寄存器。S4,S3的代碼組合及對應段寄存器的情況。
⑶BHE(低)/S7(bus high enable/status):允許匯流排高8位數據傳送/狀態信號,輸出,三態。
為匯流排高8位數據允許信號,當低電平有效時,表明在高8位數據匯流排D15 ~D8上傳送1個位元組的數據。S7為設備的狀態信號。
⑷RD/(read):讀信號,輸出,三態,低電平有效。
信號低電平有效時,表示CPU正在進行讀存儲器或讀I/O埠的操作。
⑸READY(ready):準備就緒信號,輸入,高電平有效。
READY信號用來實現CPU與存儲器或I/O埠之間的時序匹配。當READY信號高電平有效時,表示CPU要訪問的存儲器或I/O埠已經作好了輸入/輸出數據的準備工作,CPU可以進行讀/寫操作。當READY信號為低電平時,則表示存儲器或I/O埠還未準備就緒,CPU需要插入若干個“TW狀態”進行等待。
⑹INTR(interrupt request):可屏蔽中斷請求信號,輸入,高電平有效。
8086 CPU在每條指令執行到最後一個時鐘周期時,都要檢測INTR引腳信號。INTR為高電平時,表明有I/O設備向CPU申請中斷,若IF=1,CPU則會響應中斷,停止當前的操作,為申請中斷的I/O設備服務。
⑺TEST/(test):等待測試控制信號,輸入,低電平有效。
信號用來支持構成多處理器系統,實現8086 CPU與協處理器之間同步協調的功能,只有當CPU執行WAIT指令時才使用。
⑻NMI(non-maskable interrupt):非屏蔽中斷請求信號,輸入,高電平有效。
當NMI引腳上有一個上升沿有效的觸發信號時,表明CPU內部或I/O設備提出了非屏蔽的中斷請求,CPU會在結束當前所執行的指令后,立即響應中斷請求。
⑼RESET(reset):複位信號,輸入,高電平有效。
RESET信號有效時,CPU立即結束現行操作,處於複位狀態,初始化所有的內部寄存器。複位后各內部寄存器的狀態,當RESET信號由高電平變為低電平時,CPU從FFFF0H地址開始重新啟動執行程序。
⑽CLK(clock):時鐘信號,輸入。
CLK為CPU提供基本的定時脈衝信號。8086 CPU一般使用時鐘發生器8284A來產生時鐘信號,時鐘頻率為5MHz~8MHz,占空比為1:3。
⑾VCC電源輸入引腳。
8086 CPU採用單一+5V電源供電。
⑿GND:接地引腳。
⒀MN/MX/(minimum/maximum):最小/最大模式輸入控制信號。
引腳用來設置8086 CPU的工作模式。當為高電平(接+5V)時,CPU工作在最小模式;當為低電平(接地)時,CPU工作在最大模式。
CPU工作於最小模式時使用的引腳信號
當引腳接高電平時,CPU工作於最小模式。此時,引腳信號24~31的含義及其功能如下。
⑴M/IO/(memory I/O select):存儲器、I/O埠選擇控制信號。
信號指明當前CPU是選擇訪問存儲器還是訪問I/O埠。為高電平時,訪問存儲器,表示當前要進行CPU與存儲器之間的數據傳送。為低電平時,訪問I/O埠,表示當前要進行CPU與I/O埠之間的數據傳送。
⑵WR/(write):寫信號,輸出,低電平有效。
信號有效時,表明CPU正在執行寫匯流排周期,同時由信號決定是對存儲器還是對I/O埠執行寫操作。
⑶INTA/(interrupt acknowledge):可屏蔽中斷響應信號,輸出,低電平有效。
CPU通過信號對外設提出的可屏蔽中斷請求做出響應。為低電平時,表示CPU已經響應外設的中斷請求,即將執行中斷服務程序。
⑷ALE(address lock enable):地址鎖存允許信號,輸出,高電平有效。
CPU利用ALE信號可以把AD15 ~AD0地址/數據、A19/S6~A16/S3地址/狀態線上的地址信息鎖存在地址鎖存器中。
⑸DT/(data transmit or receive):數據發送/接收信號,輸出,三態。
DT/信號用來控制數據傳送的方向。DT/為高電平時,CPU發送數據到存儲器或I/O埠;DT/為低電平時,CPU接收來自存儲器或I/O埠的數據。
⑹DEN/(data enable):數據允許控制信號,輸出,三態,低電平有效。
信號用作匯流排收發器的選通控制信號。當為低電平時,表明CPU進行數據的讀/寫操作。
⑺HOLD(bus hold request):匯流排保持請求信號,輸入,高電平有效。
在DMA數據傳送方式中,由匯流排控制器8237A發出一個高電平有效的匯流排請求信號,通過HOLD引腳輸入到CPU,請求CPU讓出匯流排控制權。
⑻HLDA(hold acknowledge):匯流排保持響應信號,輸出,高電平有效。
HLDA是與HOLD配合使用的聯絡信號。在HLDA有效期間,HLDA引腳輸出一個高電平有效的響應信號,同時匯流排將處於浮空狀態,CPU讓出對匯流排的控制權,將其交付給申請使用匯流排的8237A控制器使用,匯流排使用完后,會使HOLD信號變為低電平,CPU又重新獲得對匯流排的控制權。
CPU工作於最大模式時使用的引腳信號
當引腳接低電平時,CPU工作於最大模式。此時,引腳信號24~31的含義及其功能如下。
⑴S2,S1,S0(status signals):匯流排周期狀態信號,輸出,低電平有效。
它們表明當前匯流排周期所進行的操作類型。,,代碼組合及其對應操作見表2.3。
表2.3,,代碼組合及對應操作表
⑵RQ/,GT/ (request/grant):匯流排請求允許信號輸入/匯流排請求允許輸出信號,雙向,低電平有效。
該信號用以取代最小模式時的HOLD/HLDA兩個信號的功能,是特意為多處理器系統而設計的。當系統中某一部件要求獲得匯流排控制權時,就通過此信號線向8086 CPU發出匯流排請求信號,若CPU響應匯流排請求,就通過同一引腳發迴響應信號,允許匯流排請求,表明8086 CPU已放棄對匯流排的控制權,將匯流排控制權交給提出匯流排請求的部件使用。RQ/GT0優先順序高於RQ/GT1。
⑶LOCK/(lock)匯流排封鎖信號,輸出,低電平有效。
信號有效時,表示此時8086 CPU不允許其他匯流排部件佔用匯流排。
⑷QS1,QS0(queue status):指令隊列狀態信號,輸出。
QS1和QS0信號的組合可以指示匯流排介面部件BIU中指令隊列的狀態,以便其他處理器監視、跟蹤指令隊列的狀態。
MOV
功能:把源操作數送給目的操作數
語法: MOV 目的操作數,源操作數
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data
XCHG
功能:交換兩個操作數的數據
語法: XCHG
格式: XCHG r1,r2 XCHG m,r XCHG r,m
PUSH,POP
功能:把操作數壓入或取出堆棧
語法: PUSH操作數POP 操作數
格式: PUSH r PUSH M PUSH data POP r POP m
PUSHF,POPF,PUSHA,POPA
功能:堆棧指令群
格式: PUSHF POPF PUSHA POPA
LEA,LDS,LES
功能:取地址至寄存器
語法: LEA r,m LDS r,m LES r,m
XLAT(XLATB)
功能:查表指令
語法: XLAT XLAT m
ADD,ADC
功能:加法指令
語法: ADD OP1,OP2 ADC OP1,OP2
格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data
影響標誌: C,P,A,Z,S,O
SUB,SBB
功能:減法指令
語法: SUB OP1,OP2 SBB OP1,OP2
格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data
影響標誌: C,P,A,Z,S,O
INC,DEC
功能:把OP的值加一或減一
語法: INC OP DEC OP
格式: INC r/m DEC r/m
影響標誌: P,A,Z,S,O
MUL,IMUL
功能: 乘法指令
語法: MUL OP IMUL OP
格式: MUL r/m IMUL r/m
影響標誌: C,P,A,Z,S,O(僅IMUL會影響S標誌)
DⅣ,IDⅣ
功能:除法指令
語法: DⅣ OP IDⅣ OP
格式: DⅣ r/m IDⅣ r/m
NEG
功能:將OP的符號反相(取二進位補碼)
語法: NEG OP
格式: NEG r/m
影響標誌: C,P,A,Z,S,O
CBW,CWD
功能:有符號數擴展指令
語法: CBW CWD
AAA,AAS,AAM,AAD
功能:非壓BCD碼運算調整指令
語法: AAA AAS AAM AAD
影響標誌: A,C(AAA,AAS) S,Z,P(AAM,AAD)
DAA,DAS
功能:壓縮BCD碼調整指令
語法: DAA DAS
影響標誌: C,P,A,Z,S
AND,OR,XOR,NOT,TEST
功能:執行BIT與BIT之間的邏輯運算
語法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m
影響標誌: C,O,P,Z,S(其中C與O兩個標誌會被設為0) NOT指令不影響任何標誌位
SHR,SHL,SAR,SAL
功能:移位指令
語法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL
影響標誌: C,P,Z,S,O
ROR,ROL,RCR,RCL
功能:循環移位指令
語法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL
影響標誌: C,P,Z,S,O
CLC,STC,CMC
功能:設定進位標誌
語法: CLC STC CMC
標誌位: C
CLD,STD
功能:設定方向標誌
語法: CLD STD
標誌位: D
CLI,STI
功能:設定中斷標誌
語法: CLI STI
標誌位: I
CMP
功能:比較OP1與OP2的值
語法: CMP r/m,r/m/data
標誌位: C,P,A,Z,O
JMP
功能:跳往指定地址執行
語法: JMP 地址
JXX
功能:當特定條件成立則跳往指定地址執行
語法: JXX 地址
註:
A: ABOVE,當C=0,Z=0時成立
B: BELOW,當C=1時成立
C: CARRY,當弁時成立 CXZ: CX寄存器的值為0(ZERO)時成立
E: EQUAL,當Z=1時成立
G: GREATER(大於),當Z=0且S=0時成立
L: LESS(小於),當S不為零時成立
N: NOT(相反條件),需和其它符號配合使用
O: OVERFLOW,O=1時成立
P: PARITY,P=1時成立
PE: PARITY EVEN,P=1時成立
PO: PARITY ODD,P=0時成立
S: SIGN,S=1時成立
Z: ZERO,Z=1時成立
LOOP
功能:循環指令集
語法: LOOP 地址
LOOPE(Z)
地址 LOOPNE(Z) 地址
標誌位:無
CALL,RET
功能:子程序調用,返回指令
語法: CALL 地址 RET RET n
標誌位:無
INT,IRET
功能:中斷調用及返回指令
語法: INT n IRET
標誌位:在執行INT時,CPU會自動將標誌寄存器的值入棧,在執行IRET時則會將堆棧中的標誌值彈回寄存器
串操作集
MOVSB,MOVSW,MOVSD
功能:字元串傳送指令
語法: MOVSB MOVSW MOVSD
標誌位:無
CMPSB,CMPSW,CMPSD
功能:字元串比較指令
語法: CMPSB CMPSW CMPSD
標誌位: C,P,Z,S,O
SCASB,SCASW
功能:字元串搜索指令
語法:SCASBSCASW
標誌位: C,P,Z,S,O
LODSB,LODSW,STOSB,STOSW
功能:字元串載入或存貯指令
語法:LODSBLODSWSTOSBSTOSW
標誌位:無
REP,REPE,REPNE
功能:重複前綴指令集
語法: REP 指令S REPE 指令S REPNE 指令S
標誌位:依指令S而定