80X86微處理器
一、80x86系列微處理器概況:
8086、8088、80286、80386、80486之后型號為Pentium、PentiumⅡ......
- 集成度:是指cpu芯片中所包含的晶體管數,單位為萬/片。
- 主頻:是指芯片所使用的主時鐘頻率,它直接影響計算機的運行速度。
- 數據總線:是計算機內各個組件之間傳輸數據傳輸的通道,“內部總線寬度”是CPU芯片內部數據傳輸的寬度(位數);“外部總線寬度”是CPU與外部交換數據時的數據寬度。顯然數據總線位數越多,數據交換越快。
- 地址總線:在對存儲器和I/O端口進行訪問時,傳送由CPU提供的要訪問的存儲器單元或者I/O端口地址信息的總線,其寬度決定了處理器直接訪問主存容量大小。
如8086有20根地址線,使用這20根地址線上不同地址信息的組合,可直接對2020=1M個存儲單元進行訪問;PentiumⅡ有36根地址線,因此它可直接尋址的最大范圍為236=64G。
為了滿足微型計算機對存儲器系統高速度、大容量、低成本的要求,目前微型計算機系統采用下圖的三級存儲器組織結構,即由高速緩沖器Cache、主存、外存組成。
存儲器三級結構
8086有16根數據引腳,可以存取8位或16位數據;有20根地址引腳,可以直接尋址1M(220)存儲單元和64K個I/O端口。在8086推出后不久,為方便原8位機用戶,Intel公司很快推出了8088微處理器,其指令系統與8086完全兼容,CPU內部結構仍為16位,但外部數據總線是8位的,這樣設計的目的主要是為了與原有的8位外圍接口芯片兼容。同時,IBM以8088 CPU為核心組成了IBM PC、 PCIXT等準16位微型計算機,由于其性價比高,很快占領了市場。
二、8086/8088內部結構:
1.總線接口單元BIU(BUS Interface Unit)——負責完成CPU與存儲器或I/O設備之間的數據傳送。
BIU組成
(1)4個16位的段寄存器【代碼段寄存器CS(Code Segment)、數據段寄存器DS(Data Segment)、堆棧段寄存器SS(Stack Segment)和附加數據段寄存器ES(Extra Segment);】
(2)1個16位的指針指令寄存器IP
(2)一個20位的地址加法器
(3)6個字節的指令緩沖器
(4)一個與EU通信的內部寄存器和總線控制電路。
8086CPU的地址引腳有20根,能提供20位的地址信息,可直接對1M個存儲單元進行訪問,但CPU內部可用來提供地址信息的寄存器都是16位的,那么如何用16位寄存器實現20位地址的尋址呢?8086/8088采用了段結構的內存管理的方法。
??(1)段寄存器:將指令代碼和數據分別存儲在代碼段、數據段、堆棧段、附加數據段中,這些段的段地址分別由段寄存器CS、DS、SS、ES提供。
代碼段寄存器CS:存儲程序當前使用的代碼段的段地址。代碼段用來存放程序的指令代碼。下一條要讀取指令在代碼段中的偏移地址由指令指針寄存器IP提供;
數據段寄存器DS:用來存放程序當前使用的數據段的段地址。一般來說,程序中所用到的原始數據、中間結果以及最終結果都存放在數據段中;
堆棧段寄存器SS:用來存放程序當前所使用的堆棧段的段地址。堆棧是在存儲器中開辟的一個特定區域;
附加數據段寄存器ES:用來存放程序當前使用的附加數據段的段地址。附加數據段通常用于存放字符串操作時的目的字符串。
??(2)指令指針寄存器: 指令指針寄存器IP用來存放下一條要讀取的指令在代碼段中的偏移地址。IP在程序運行中能自動加1修正,從而使其始終存放的是下一條要讀取的指令在代碼段的偏移地址。由于CS和IP的內容決定了程序的執行順序,因此程序員不能直接用賦值指令對其內容進行修改。有些指令能使IP和CS的值改變(如跳轉指令)或使其值壓入堆棧或從堆棧中彈出恢復原值(如子程序調用指令和返回指令)。
??(3)20位的地址加法器: CPU提供的用來對存儲單元進行訪問的20位地址是由BIU中的地址加法器產生的。
存儲器中每個存儲單元的地址可有以下兩種表示方式:
(1)邏輯地址:表達形式為段地址:段內偏移地址
段內偏移地址又稱為“有效地址EA(Effective Address)。
讀指令時,段地址由代碼段寄存器CS提供,偏移地址由指令指針寄存器IP提供;
讀取或存儲操作數時,段地址由DS、ES或SS提供,段內偏移地址由指令給出。
(2)物理地址:CPU與存儲器進行數據交換時在地址總線上提供的20位地址信息稱為物理地址。
段寄存器內容左移四位后(相當于乘以10H)得到段基址(段內第一個存儲單元的物理地址)。
把段內偏移地址和段基址同時送到BIU中的地址加法器,形成一個20位的物理地址,從而實現對存儲單元的訪問。
**物理地址=段地址×10H+段內偏移地址 **
例如假設當前(CS)=20A8H,(IP)=2008H,那么,下一條從內存中讀取的指令所在存儲單元的物理地址為:20A8H×10H+ 2008H=22A88H。
物理地址的形成
對于任何一個物理地址來說,可以唯一被包含在一個邏輯段中,也可以包含在多個重疊的邏輯段中,只要能得到它所在段的首地址和段內的相對地址,就可以對它進行訪問。即一個物理地址可以對應多個邏輯地址。
??(4)指令隊列緩沖器:8086的指令隊列有6個字節,8088的指令隊列有4個字節。對8086而言,當指令隊列出現2個空字節,對8088而言,指令隊列出現1個空字節時,BIU就自動執行一次取指令周期,將下一條要執行的指令從內存單元讀入指令隊列。它們采用“先進先出”原則,按順序存放,并按順序取到EU中去執行。
指令隊列的引入使得EU和BIU可并行工作,即BIU在讀指令時,并不影響EU單元執行指令,EU單元可以連續不斷地直接從指令隊列中取到要執行的指令代碼,從而減少了CPU為取指令而等待的時間,提高了CPU的利用率,加快了整機的運行速度。
2.執行單元EU(Execution Unit)——不與系統外部直接相連,它的功能只是負責執行命令。 EU執行的指令從BIU的指令隊列緩沖器中直接得到。執行指令時若需要從存儲器或I/O端口讀寫操作數時,由EU向BIU發出請求,再由BIU對存儲器或I/O端口進行訪問。
EU組成
(1)16位算數邏輯單元(ALU):進行算術和邏輯運算。
(2)16位的表示寄存器FLAGS:存放CPU運算的狀態和控制標志。
(3)通用寄存器:包括4個16位數據寄存器AX、BX、CX、DX和4個16位指針與變址寄存器SP、BP與SI、DI。
(4)數據暫存寄存器:暫存參加運算的數據
(5)EU控制電路:它是控制、定時與狀態邏輯電路,接收從BIU中指令隊列取來的指令,經過指令譯碼形成各種定時控制信號,對EU的各個部件實現特定的定時操作。
三、8086/8088寄存器結構:
1.通用寄存器:
(8個):包括四個數據寄存器AX(AH/AL), BX(BH/BL),CX(CH/CL),DX(DH/DL),兩個地址指針寄存器(SP,BP)和兩個變址寄存器(SI,DI)。
1.數據寄存器AX、BX、CX、DX
??數據寄存器一般用于存放參與運算的操作數或運算結果。每個數據寄存器都是16位的,但又可將高、低8位分別作為兩個獨立的8位寄存器來用。高8位分別記作AH、BH、CH、DH,低8位分別記作AL,BL,CL,DL。注意:8086/8088 CPU的14個寄存器除了這4個16位寄存器能分別當作兩個8位寄存器來用之外,其它寄存器都不能如此使用。
?? AX(Accumulator)稱為累加器:用該寄存器存放運算結果可使指令簡化,提高指令的執行速度。此外,所有的I/O指令都使用該寄存器與外設端口交換信息。
??BX(Base)稱為基址寄存器:8086/8088CPU中有兩個基址寄存器BX和BP。BX用來存放操作數在內存中數據段內的偏移地址,BP用來存放操作數在堆棧段內的偏移地址。
??CX(Counter)稱為計數器:在設計循環程序時使用該寄存器存放循環次數,可使程序指令簡化,有利于提高程序的運行速度。
??DX(Data)稱為數據寄存器:在寄存器間接尋址的I/O指令中存放I/O端口地址;在做雙字長乘除法運算時,DX與AX一起存放一個雙字長操作數,其中DX存放高16位數。
2. 地址指針寄存器SP、BP
??SP(Stack Pointer)稱為堆棧指針寄存器。在使用堆棧操作指令(PUSH或POP)對堆棧進行操作時,每執行一次進棧或出棧操作,系統會自動將SP的內容減2或加2,以使其始終指向棧頂。
??BP(Base Pointer)稱為基址寄存器。作為通用寄存器,它可以用來存放數據,但更經常更重要的用途是存放操作數在堆棧段內的偏移地址。
3.變址寄存器SI、DI
??SI(Source Index)稱為源變址寄存器。
??DI(Destination Index)稱為目的變址寄存器。
??這兩個寄存器通常用在字符串操作時存放操作數的偏移地址,其中SI存放源串在數據段內的偏移地址,DI存放目的串在附加數據段內的偏移地址。
2.段寄存器:
??為了對1M個存儲單元進行管理,8086/8088對存儲器進行分段管理,即將程序代碼或數據分別放在代碼段、數據段、堆棧段或附加數據段中,每個段最多可達64K個存儲單元。段地址分別放在對應的段寄存器中,代碼或數據在段內的偏移地址由有關寄存器或立即數給出。
CS(Code Segment)——代碼段寄存器。用來存儲程序當前使用的代碼段的段地址。
DS(Data Segment)——數據段寄存器。用來存放程序當前使用的數據段的段地址。
SS(Stack Segment)——堆棧段寄存器。用來存放程序當前所使用的堆棧段的段地址。
ES(Extra Segment)——附加數據段寄存器。用來存放程序當前使用的附加數據段的段地址。
下圖為段寄存器與提供段內偏移地址的寄存器之間的默認組合
3.控制寄存器:
IP(Instruction Pointer)——指令指針寄存器。用來存放下一條要讀取的指令在代碼段內的偏移地址。用戶程序不能直接訪問IP。
FLAGS——標志寄存器。它是一個16位的寄存器,但只用了其中9位,這9位包括6個狀態標志位,3個控制標志位,如圖所示。
1. 狀態標志位(6位)
??狀態標志位用來反映算術和邏輯運算結果的一些特征。下面分別介紹這6個狀態標志位的功能。
??CF(Carry Flag)——進位標志。當進行加減運算時,若最高位發生進位或借位則CF為1,否則為0。通常用于判斷無符號數運算結果是否超出了計算機所能表示的無符號數的范圍。
??PF(Parity Flag)——奇偶標志位。當指令執行結果的低8位中含有偶數個1時,PF為1,否則為0。
??AF(Auxiliary Flag)——輔助進位標志位。當執行一條加法或減法運算指令時,若結果的低字節的低4位向高4位有進位或借位,則AF為1,否則為0。
??ZF(Zero Flag)——零標志位。若當前的運算結果為0,則ZF為1,否則為0。
??SF(Sign Flag)——符號標志位。當運算結果的最高位為1時,SF=1,否則為0。
??OF(Overflow Flag)——溢出標志位。當運算結果超出了帶符號數所能表示的數值范圍,即溢出時,OF=1,否則為0。用來判斷帶符號數運算結果是否溢出。
例如: 設變量x=11101111B,y=11001000B,X=0101101000001010B,Y=01001100 10100011B,請問分別執行x+y和X+Y操作后標志寄存器中各狀態位的狀態如何?
2. 控制標志位(3位)
用來控制CPU的操作,由程序設置或清除。它們是:
TF(Trap Flag)——跟蹤(陷阱)標志位。是為測試程序的方便而設置。若將TF置1,CPU處于單步工作方式。
IF(Interrupt Flag)——中斷允許標志位。是用來控制可屏蔽中斷的控制標志位。若將IF置1,表示允許CPU接受外部從INTR引腳上發來的可屏蔽中斷請求;若用CLI指令將IF清0,則禁止CPU接受可屏蔽中斷請求信號。
DF(Direction Flag)——方向標志位。若將DF置1,串操作按減地址方式進行,也就是說,從高地址開始,每操作一次地址自動遞減;否則按增地址方式進行。
四、8086/8088存儲器和I/O組織
<一>.8086/8088存儲器組織
1.8086/8088存儲器結構
??8086/8088有20條地址線,可直接對1 M個存儲單元進行訪問。每個存儲單元存放一個字節型數據,且每個存儲單元都有一個20位的地址,這1 M個存儲單元對應的地址為00000H~FFFFFH,如圖所示。
一個存儲單元中存放的信息稱為該存儲單元的內容。
?如00001H單元的內容為9FH,記為:(00001H)=9FH。
?如從地址0011FH開始的兩個連續單元中存放一個字型數據,則該數據為DF46H,記為:(0011FH)=DF46H。
?若存放的是雙字型數據(32位二進制數),這種類型的數據要占用連續的4個存儲單元,同樣,低字節存放在低地址單元,高字節存放在高地址單元。如從地址E800AH開始的連續4個存儲單元中存放了一個雙字型數據,則該數據為66A65E65H,記為:(E800AH)=66A65E65H。
??8086的1M存儲空間實際上分為兩個512KB的存儲體,又稱存儲庫,分別叫高位庫和低位庫。如下圖:
地址總線A19~A1可同時對高、低位庫的存儲單元尋址,A0和 BHE非 用于對庫的選擇。
當A0=0時,選擇偶數地址的低位庫;
當BHE非=0時,選擇奇數地址的高位庫;
當兩者均為0時,則同時選中高低位庫。
需注意的是,對于規則字(從偶數地址開始存放的字)的讀/寫操作只需一個總線周期,而非規則字(從奇數地址開始存放的字)的讀/寫操作需兩個總線周期。
在8088系統中,可直接尋址的存儲空間同樣也是1 MB,但其存儲器的結構與8086有所不同,它的1MB 存儲空間同屬于一個單一的存儲體,即存儲體為1 M×8位。它與總線之間的連接方式很簡單,其20根地址線A19~A0與8根數據線分別與8088 CPU對應的地址線和數據線相連。8088 CPU每訪問一次存儲器只能讀/寫一個字節信息,因此在8088系統的存儲器中,字型數據需要兩次訪問存儲器才能完成讀/寫操作。
2.存儲器的段結構:
??8086/8088 CPU中有關可用來存放地址的寄存器如IP、SP等都是16位的,故只能直接尋址64 KB。為了對1 M個存儲單元進行管理,8086/8088采用了段結構的存儲器管理方法。
??8086/8088將整個存儲器分為許多邏輯段,每個邏輯段的容量小于或等于64 KB,允許它們在整個存儲空間中浮動,各個邏輯段之間可以緊密相連,也可以互相重疊。
4.堆棧操作:
??堆棧是在存儲器中開辟的一個特定區域。開辟堆棧的目的主要有以下兩點:
??(1) 存放指令中的操作數(變量)。此時,對操作數進行訪問時,段地址由堆棧段寄存器SS來提供,操作數在該段內的偏移地址由堆棧指針SP或基址寄存器BP來提供。
??(2) 保護斷點和現場。此為堆棧的主要功能。
??進棧和出棧操作過程:
??在執行進棧和出棧操作時,段地址由堆棧段寄存器SS提供,段內偏移地址由堆棧指針寄存器SP提供,當堆棧空時,SP指向棧底。每進行一次進棧操作,SP值減2;每進行一次出棧操作,SP值加2。在進棧和出棧操作過程中,SP始終指向棧頂。
<二>.8086/8088I/O組織
??8086/8088系統和外部設備之間是通過I/O接口電路來聯系的。每個I/O接口都有一個或幾個端口。在微機系統中每個端口分配一個地址號,稱為端口地址。一個端口通常為I/O接口電路內部的一個寄存器或一組寄存器
??8086/8088CPU用地址總線的低16位作為對8位I/O端口的尋址線,所以8086/8088系統可訪問的8位I/O端口有65536(64K)個。兩個編號相鄰的8位端口可以組成一個16位的端口。
??8086CPU對I/O設備的讀寫與對存儲器的讀寫操作類似。當CPU與偶地址的I/O端口實現16位數據的存取操作時,可在一個總線周期內完成;當CPU與奇地址的I/O端口實現16位數據的存取操作時,要占用兩個總線周期才能完成。
??需要說明的是,8086/8088 CPU的I/O指令可以用16位的有效地址A15A0來尋址0000FFFFH共64 K個端口,但IBM PC系統中只使用了A9~A0 10位地址來作為I/O端口的尋址信號,因此,其I/O端口的地址僅為000 ~3FFH共1K個。