寄存器是CPU內(nèi)部用來放置數(shù)據(jù)和地址的存儲(chǔ)單元,各種32位CPU中與微機(jī)原理有關(guān)的寄存器(編程可見)是一樣的。本節(jié)仍以80486為例機(jī)來討論,但結(jié)論可以不加修改地用于其它32位CPU。
位于CPU內(nèi)部不同部件的寄存器有不同的作用,每個(gè)寄存器都有自己的功能。根據(jù)寄存器的性質(zhì),把編程可見的寄存器分成9組,并給每個(gè)編程可見的寄存器(以后簡(jiǎn)稱寄存器)取一個(gè)名稱
1 通用寄存器
通用寄存器中,32位寄存器EAX,EBX,ECX,EDX,EBP,ESP,ESI和EDI,它們既可保存邏輯和算術(shù)運(yùn)算中的操作數(shù),也可保存地址運(yùn)算中的操作數(shù)(ESP寄存器不能用作基址寄存器)。這些寄存器的名稱源于8086處理機(jī)的通用寄存器AX,BX,CX,DX,BP,SP,SI和DI。所以,這些通用寄存器的低16位可按原來的名字訪問。16位寄存器AX,BX,CX,DX的每個(gè)字節(jié)均另有一個(gè)名字。字節(jié)寄存器命名為AH,BH,CH及DH(高字節(jié))和AL,BL,CL和DL(低字節(jié))。
16位寄存器與8位寄存器分別用于實(shí)現(xiàn)對(duì)16位CPU與8位CPU的兼容
2 指令指針指示器——EIP
它是32位寄存器,低16位稱為IP,用與兼容16位CPU,其內(nèi)容是下一條要取入CPU的指令在內(nèi)存中的偏移地址。當(dāng)一個(gè)程序開始運(yùn)行時(shí),系統(tǒng)把EIP清零,每取入一條指令,EPI自動(dòng)增加取入CPU的字節(jié)數(shù)目。所以稱EIP為指令指針。
3 標(biāo)志寄存器——EFLAGS
32位寄存器,低16位稱為FLAGS,與16位CPU的標(biāo)志寄存器同名、同作用。
可分為3類:狀態(tài)標(biāo)志、控制標(biāo)志和系統(tǒng)標(biāo)志。簡(jiǎn)述如下:
AF——輔助進(jìn)位標(biāo)志。若該位置位時(shí),表示最低有效的4位向高位產(chǎn)生了進(jìn)位或借位,則該標(biāo)志位主要用于BCD算術(shù)運(yùn)算。
CF——進(jìn)位標(biāo)志。當(dāng)該位置位,表示8位或16位或32位數(shù)的算術(shù)操作產(chǎn)生了進(jìn)位或借位。進(jìn)行多字節(jié)數(shù)的加、減時(shí)要使用該標(biāo)志。循環(huán)移位指令也影響進(jìn)位標(biāo)志。
PF——奇偶標(biāo)志。主要用于數(shù)據(jù)通訊應(yīng)用程序中,當(dāng)該位置位時(shí),表示結(jié)果數(shù)據(jù)位中有偶數(shù)個(gè)1,可以檢查數(shù)據(jù)傳送中是否出現(xiàn)錯(cuò)誤。
SF——符號(hào)標(biāo)志。該位置位時(shí)表示結(jié)果的最高位(符號(hào)位)為1。對(duì)于帶符號(hào)數(shù),該位為1表示負(fù)數(shù),該位為0表示正數(shù)。
ZF——零標(biāo)志。當(dāng)該位置位時(shí),表示操作的結(jié)果為0。
DF——方向標(biāo)志。用于控制數(shù)據(jù)串操作指令中的地址變化方向。DF為0時(shí),SI/DI或ESI/EDI為自動(dòng)增量,地址從低向高變化,DF為1,SI/DI或ESI/EDI為自動(dòng)減量,地址從高向低變化。
IF——中斷允許標(biāo)志。該位置1時(shí)允許響應(yīng)外部可屏蔽中斷(INTR),該位復(fù)位時(shí)禁止響應(yīng)外部可屏蔽中斷。IF不影響非屏蔽外部中斷(NMI)或內(nèi)部產(chǎn)生的中斷。
OF——溢出標(biāo)志。若該位置位表示此次運(yùn)算發(fā)生了溢出,即作為帶符號(hào)數(shù)運(yùn)算,其結(jié)果值超出目的單位所能表示的數(shù)值范圍。這時(shí)目的單位的內(nèi)容對(duì)帶符號(hào)數(shù)沒有意義。
TF——陷阱標(biāo)志。當(dāng)該位置位時(shí),把處理器置成供調(diào)試的單步方式。在這種方式中,每條指令執(zhí)行后CPU自動(dòng)產(chǎn)生一個(gè)內(nèi)部中斷,使調(diào)試者可以觀察程序中該條指令執(zhí)行的情況。
NT——嵌套任務(wù)標(biāo)志。用來表示當(dāng)前的任務(wù)是否嵌套在另一任務(wù)內(nèi),當(dāng)該位置1時(shí),表示當(dāng)前的任務(wù)有一個(gè)有效的鏈連接到前一個(gè)任務(wù)(被嵌套),如果執(zhí)行IRET指令,則轉(zhuǎn)換到前一個(gè)任務(wù)。
IOPL——輸入/輸出特權(quán)級(jí)標(biāo)志,用于定義允許執(zhí)行輸入/輸出指令的I/O特權(quán)級(jí)的數(shù)值。
RF——恢復(fù)標(biāo)志。它是與調(diào)試寄存器的斷點(diǎn)一起使用的標(biāo)志,當(dāng)該位置1時(shí),即使遇到斷點(diǎn)或調(diào)試故障,也不產(chǎn)生異常中斷1。在成功地執(zhí)行每條指令時(shí),RF將自動(dòng)復(fù)位。
VM——虛擬8086方式標(biāo)志。當(dāng)該位置位時(shí),CPU工作在虛擬8086模式(簡(jiǎn)稱為擬86模式),在這種模式下運(yùn)行8086的程序就好象是在8086CPU上運(yùn)行一樣。
AC——對(duì)準(zhǔn)檢查標(biāo)志。這是80486新定義的標(biāo)志位。該位置位時(shí),如果進(jìn)行未對(duì)準(zhǔn)的地址訪問,則產(chǎn)生異常中斷17。所謂未對(duì)準(zhǔn)的地址訪問,是指訪問字?jǐn)?shù)據(jù)時(shí)為奇地址,訪問雙字?jǐn)?shù)據(jù)時(shí)不是4的倍數(shù)地址,訪問8字節(jié)數(shù)據(jù)時(shí),不是8的倍數(shù)的地址。對(duì)準(zhǔn)檢查在特權(quán)級(jí)為0,1,2時(shí)無效,只有在特權(quán)級(jí)3時(shí)有效。
s—狀態(tài)標(biāo)志;c—控制標(biāo)志;x—系統(tǒng)標(biāo)志
4 段寄存器
段寄存器有兩部分,一部分是編程可見的選擇器寄存器,為6個(gè)16位寄存器,對(duì)應(yīng)在另一部分有6個(gè)64位的描述符寄存器,后一部分是編程不可見的。
在實(shí)地址方式或虛擬8086方式,描述符寄存器不起作用,選擇器寄存器退化成16位CPU的段寄存器功能,存放內(nèi)存段的段基址——段首地址的高16位,其中CS對(duì)應(yīng)于代碼段、SS對(duì)應(yīng)于堆棧段,DS對(duì)應(yīng)于數(shù)據(jù)段,ES對(duì)應(yīng)于附加數(shù)據(jù)段,在串操作時(shí),DS和ES分別對(duì)應(yīng)于源數(shù)據(jù)段和目的數(shù)據(jù)段。FS和GS沒有定義。
在保護(hù)方式下,選擇器寄存器的低二位是特權(quán)標(biāo)志,D2位是描述符表類型標(biāo)志,高13位是選擇碼,指出本段的段描述符在由D2位指出的描述符表中的邏輯排序。當(dāng)一個(gè)段第一次被訪問時(shí),首先根據(jù)指令給出的選擇器值的D2位及高13位,到內(nèi)存中相應(yīng)的描述符表內(nèi)取出相應(yīng)的描述符(64位),送入對(duì)應(yīng)的描述符寄存器,再從描述符中取出段基址進(jìn)行邏輯地址到線性地址的變換。以后再訪問該段時(shí),直接從描述符寄存器取用段基址及安全檢查,免去從內(nèi)存中選取描述符的過程,實(shí)現(xiàn)加速運(yùn)行。
5 系統(tǒng)地址寄存器
在80486微處理器中設(shè)置有4個(gè)系統(tǒng)地址寄存器,用來在保護(hù)方式下管理4個(gè)系統(tǒng)表。由于只能在保護(hù)方式下使用,因此又稱為保護(hù)方式寄存器。
(1) 全局描述符表寄存器GDTR,是一個(gè)48位寄存器,用來存放全局描述符表GDT的32位線性基地址和16位的界限值。在全局描述符表中不僅包括有操作系統(tǒng)使用的描述符,而且還有所有任務(wù)使用的公用描述符。
(2) 中斷描述符表寄存器IDTR,是一個(gè)48位寄存器,用來存放中斷描述符表IDT的32位線性基地址和16位的界限值。
(3) 局部描述符表寄存器LDTR,是一個(gè)16位寄存器,用來存放局部描述符表LDT的16位選擇符。另外還有一個(gè)隱含的描述符高速緩沖寄存器,用來存放LDT表描述符。
(4) 任務(wù)狀態(tài)寄存器TR,是一個(gè)16位寄存器,用來存放任務(wù)狀態(tài)段TSS的16位選擇符。與之相應(yīng),也有一個(gè)隱含的描述符高速緩沖寄存器,用來存放任務(wù)狀態(tài)段TSS的描述符。
段寄存器與系統(tǒng)地址寄存器一起為操作系統(tǒng)完成內(nèi)存管理,多任務(wù)環(huán)境、任務(wù)保護(hù)提供硬件支持。
6 調(diào)試寄存器
有8個(gè),各32位,如圖2.5所示,表示為DR0~DR7。其中DR0~DR3用作線性斷點(diǎn)地址寄存器,可保存4個(gè)斷點(diǎn)地址。DR6用作斷點(diǎn)狀態(tài)寄存器,用來設(shè)置若干個(gè)狀態(tài)標(biāo)志。其中低4位分別表示4個(gè)斷點(diǎn)處的調(diào)試狀態(tài)。若進(jìn)入調(diào)試狀態(tài),由硬件置1;退出調(diào)試狀態(tài)時(shí)應(yīng)由軟件清0。另外還有3位,即BT,BS和BD,其中BT是與任務(wù)狀態(tài)段中調(diào)試自陷位T相關(guān)的狀態(tài)標(biāo)志位,BS是與狀態(tài)標(biāo)志寄存器中的自陷標(biāo)志TF相關(guān)的狀態(tài)標(biāo)志位,BD是當(dāng)內(nèi)部電路仿真使用的下一條指令將對(duì)8個(gè)調(diào)試寄存器中的任一個(gè)讀/寫時(shí)置1。DR7是斷點(diǎn)控制寄存器,用來設(shè)置控制標(biāo)志,控制斷點(diǎn)的設(shè)置、設(shè)置條件、斷點(diǎn)地址的有效范圍以及是否進(jìn)入異常中斷等。DR4~DR5為Intel公司保留。
7 測(cè)試寄存器
有5個(gè)測(cè)試寄存器,各32位,如圖2.5所示,表示為TR3~TR7。其中TR3~TR5用于片內(nèi)Cache測(cè)試。TR6~TR7用來控制分頁部件中的轉(zhuǎn)換旁視緩沖存儲(chǔ)器TLB的工作。TR6作為測(cè)試命令寄存器,用來存放測(cè)試控制命令,TR7作為數(shù)據(jù)寄存器,用來存放轉(zhuǎn)換旁視緩沖存儲(chǔ)器測(cè)試的數(shù)據(jù)。
8 控制寄存器
共有4個(gè),各32位,用來存放全局性與任務(wù)無關(guān)的機(jī)器狀態(tài),
1) CR0用來存放系統(tǒng)控制標(biāo)志或表示處理器的狀態(tài),共定義了11位,使用如下:
PE——保護(hù)方式允許位。置1,進(jìn)入 保護(hù)方式;清0,進(jìn)入實(shí)地址方式。
MP——監(jiān)控協(xié)處理器位。置1,表示有協(xié)處理器。若在80486系統(tǒng)中運(yùn)行80286或80386程序,該位置1;若運(yùn)行80486程序,該位清0。
EM——模擬協(xié)處理器位。在運(yùn)行80286或80386程序時(shí),該位置1,若執(zhí)行數(shù)值指令就會(huì)產(chǎn)生協(xié)處理器不能使用的異常中斷;在80486SX系統(tǒng)中該位必須置1。
TS——任務(wù)切換位。每次任務(wù)轉(zhuǎn)換,該位置1。在解釋浮點(diǎn)算術(shù)運(yùn)算指令時(shí),對(duì)該位進(jìn)行測(cè)試。清除任務(wù)切換標(biāo)志指令CLTS可將該位清0。
ET——處理器擴(kuò)展類型標(biāo)志。該位置1,表示配置80387;否則表示未配置。
NE——數(shù)值異常事故位,用來控制浮點(diǎn)運(yùn)算中未被屏蔽的異常故障。該位置1,允許報(bào)告浮點(diǎn)數(shù)值錯(cuò);該位清0,且輸入有效,則不予以報(bào)告。當(dāng)NE清0,且輸入無效時(shí),數(shù)值錯(cuò)將會(huì)使處理器停止運(yùn)行,并等待一次中斷。
WP——寫保護(hù)位,用來凈化80486的頁寫保護(hù)機(jī)構(gòu),即保護(hù)用戶級(jí)的那些頁。該位置1,禁止管理級(jí)的寫操作寫入用戶級(jí)的頁上;該位清0,管理級(jí)可向用戶級(jí)的頁進(jìn)行寫入。
AM——對(duì)準(zhǔn)屏蔽位,與狀態(tài)標(biāo)志AC配合使用,控制對(duì)數(shù)據(jù)的對(duì)準(zhǔn)校驗(yàn)。該位置1,且AC也置1時(shí),對(duì)用戶級(jí)(CPL=3)訪問的存儲(chǔ)器單元進(jìn)行對(duì)準(zhǔn)校驗(yàn),即邊界檢查,否則不校驗(yàn)。
NW——不透明寫位,也稱為不是寫貫穿,用來控制Cache操作。該位清0,所有命中Cache的寫操作將按寫貫穿方式寫入Cache,同時(shí)寫入主存;該位置1(且CD=1)只寫入Cache存儲(chǔ)器,而不寫入主存。
CD——允許Cache位,用來控制是否使用片內(nèi)Cache。該位清0,允許使用內(nèi)部Cache,這時(shí)若不命中,可對(duì)片內(nèi)Cache存儲(chǔ)器填充寫入;該位置1,又不命中Cache時(shí)不能對(duì)Cache填充寫入。若訪問Cache命中,則Cache正常運(yùn)行。若要徹底禁Cache,可用專門的指令I(lǐng)NVD或WBINVD對(duì)片內(nèi)Cache刷新。所謂刷新,是使片內(nèi)Cache中的所有數(shù)據(jù)無效(即清0)。
PG——允許分頁位。該位置1,使分頁部件有效;該位清0,禁止分頁部件工作。
(2) CR1未用。
(3) CR2為頁故障線性地址寄存器,用來保存最后出現(xiàn)頁故障的32位線性地址。只有當(dāng)CR\-0中的PG位為1時(shí),CR2才有意義。
(4) CR3為頁目錄基址寄存器,其中高20位存放頁目錄表的物理基地址。在低12位中有2位作為標(biāo)志位,其余10位未用。 標(biāo)志位作用如下:
PCD——禁止頁高速緩沖位,該位置1,不對(duì)頁進(jìn)行高速緩沖操作。在不分頁情況下的總線周期,該信號(hào)由PCD引腳輸出,控制外部二級(jí)Cache的高速緩沖操作。
PWT——寫貫穿位。在80486內(nèi)部Cache中使用的是“寫貫穿”方式,而外部二級(jí)Cache有的使用“寫貫穿”方式,有的既可使用“寫貫穿”方式又可使用“寫回”方式。PWT=1,使片外二級(jí)Cache采用“寫貫穿”方式,否則采用“寫回”方式。
所謂“寫貫穿”是向Cache寫入數(shù)據(jù)的同時(shí),也寫入到主存中?!皩懟亍笔侵挥挟?dāng)Cache中的某一存儲(chǔ)塊被刷新時(shí),才把這一存儲(chǔ)塊寫回到主存中去。
9 浮點(diǎn)寄存器
由于在80486微處理器內(nèi)部設(shè)有浮點(diǎn)運(yùn)算器,因此在其內(nèi)部有相應(yīng)的寄存器,其中包括8個(gè)80位通用數(shù)據(jù)寄存器、1個(gè)48位指令指針寄存器、1個(gè)48位數(shù)據(jù)指針寄存器、1個(gè)16位控制字寄存器、1個(gè)16位狀態(tài)字寄存器和1個(gè)16位標(biāo)記字寄存器。這些寄存器主要用于浮點(diǎn)運(yùn)算,其作用將在浮點(diǎn)運(yùn)算中介紹。
10 CPU復(fù)位后各寄存器的值
復(fù)位(包括硬復(fù)位、軟復(fù)位、初上電)后CPU各寄存器的值列于表2.1中。表中BIST為復(fù)位期間80486微處理機(jī)運(yùn)行內(nèi)存自檢功能。
復(fù)位后CR0中的PE位為0(CR0為60000000H)。所以復(fù)位后CPU處于實(shí)地址工作方式。這時(shí)CS=0F000H,EIP=0FFF0H,所以CPU訪問的第一個(gè)內(nèi)存單元的物理地址為0FFFFFFF0H。
表1 復(fù)位后各寄存器的值 寄存器 初始值(BIST) 初始值(NO BIST)
EAX 0(通過) 不定
ECX 不定 不定
EDX 0400+版本ID 0400+版本ID
EBX 不定 不定
ESP 不定 不定
EBP 不定 不定
ESI 不定 不定
EDI 不定 不定
EFLAGS 0000002H 0000002H
EIP 0FFF0H 0FFF0H
ES 0000H 0000H
CS F000H F000H
SS 0000H 0000H
DS 0000H 0000H
續(xù)表 寄存器 初始值(BIST) 初始值(NO BIST)
FS 000H 000H
GS 000H 000H
IDTR 基值=0,界限=3FFH 基值=0,界限=3FFH
CR0 60000000H 60000000H
DR7 00000000H 00000000H
CW 037FH 不變
SW 0000H 不變
TW FFFFH 不變
FIP 00000000H 不變
FEA 00000000H 不變
FCS 0000H 不變
FDS 0000H 不變
FOP 000H 不變
FSTACK 不定 不變