80X87FPU浮點(diǎn)數(shù)據(jù)的格式、浮點(diǎn)寄存器的特點(diǎn)
浮點(diǎn)數(shù)據(jù)格式:
在計(jì)算機(jī)中,實(shí)數(shù)的浮點(diǎn)格式(Floating-Point Format)所示,分成指數(shù)、有效數(shù)字和符號(hào)位三個(gè)部分。
·? 符號(hào)(Sign)——表示數(shù)據(jù)的正負(fù),在最高有效位(MSB)。負(fù)數(shù)的符號(hào)位為1,正數(shù)的符號(hào)為0。
·? 指數(shù)(Exponent)——也被稱為階碼,表示數(shù)據(jù)以2為底的冪。指數(shù)采用偏移碼(Biased Exponent)表示,恒為整數(shù)。
·? 有效數(shù)字(Significand)——表示數(shù)據(jù)的有效數(shù)字,反映數(shù)據(jù)的精度。有效數(shù)字一般采用規(guī)格化(Normalized)形式,是一個(gè)純小數(shù),所以也被稱為尾數(shù)(Mantissa)、小數(shù)或分?jǐn)?shù)(Fraction)。
????? 80x87支持三種浮點(diǎn)數(shù)據(jù)類型:?jiǎn)尉取㈦p精度和擴(kuò)展精度;它們的長(zhǎng)度依次為32、64和80位,即4、8和10個(gè)字節(jié);
·? 單精度浮點(diǎn)數(shù)(32位短實(shí)數(shù))——由1位符號(hào)、8位指數(shù)、23位有效數(shù)組成。
·? 雙精度浮點(diǎn)數(shù)(64位長(zhǎng)實(shí)數(shù))——由1位符號(hào)、11位指數(shù)、52位有效數(shù)組成。
·? 擴(kuò)展精度浮點(diǎn)數(shù)(80位臨時(shí)實(shí)數(shù))——由1位符號(hào)、15位指數(shù)、64位有效數(shù)組成。很多計(jì)算機(jī)中并沒(méi)有80位擴(kuò)展精度這種數(shù)據(jù)類型,80x87 FPU主要在內(nèi)部使用它存貯中間結(jié)果,以保證最終數(shù)值的精度。
80x87的指令系統(tǒng)
浮點(diǎn)處理單元FPU具有自己的指令系統(tǒng),共有幾十種浮點(diǎn)指令,可以分成傳送、算術(shù)運(yùn)算、超越函數(shù)、比較、FPU控制等類。浮點(diǎn)指令歸屬于ESC指令,其前5位的操作碼都是11011b,它的指令助記符均以F開(kāi)頭。
1. 浮點(diǎn)傳送類指令
??? 浮點(diǎn)數(shù)據(jù)傳送指令完成主存與棧頂st(0)、數(shù)據(jù)寄存器st(i)與棧頂之間的浮點(diǎn)格式數(shù)據(jù)的傳送。浮點(diǎn)數(shù)據(jù)寄存器是一個(gè)首尾相接的堆棧,所以它的數(shù)據(jù)傳送實(shí)際上是對(duì)堆棧的操作,有些要改變堆棧指針TOP,即修改當(dāng)前棧頂。
2. 算術(shù)運(yùn)算類指令
??? 這類浮點(diǎn)指令實(shí)現(xiàn)浮點(diǎn)數(shù)、16/32位整數(shù)的加、減、乘、除運(yùn)算,它們支持的尋址方式相同。這組指令還包括有關(guān)算術(shù)運(yùn)算的指令,例如求絕對(duì)值、取整等。
3. 超越函數(shù)類指令
??? 浮點(diǎn)指令集中包含有進(jìn)行三角函數(shù)、指數(shù)和對(duì)數(shù)運(yùn)算的指令。
4. 浮點(diǎn)比較類指令
??? 浮點(diǎn)比較指令比較棧頂數(shù)據(jù)與指定的源操作數(shù),比較結(jié)果通過(guò)浮點(diǎn)狀態(tài)寄存器反映。
5. FPU控制類指令
??? FPU控制類指令用于控制和檢測(cè)浮點(diǎn)處理單元FPU的狀態(tài)及操作方式。
采用浮點(diǎn)指令的匯編語(yǔ)言程序格式,與整數(shù)指令源程序格式是類似的,但有以下幾點(diǎn)需要注意:
·? 使用FPU選擇偽指令
????? 由于匯編程序MASM默認(rèn)只識(shí)別8086指令,所以要加上.8087 / .287 / .387等偽指令選擇匯編浮點(diǎn)指令;有時(shí),還要加上相應(yīng)的.238/.386等偽指令。
·? 定義浮點(diǎn)數(shù)據(jù)
????? 數(shù)據(jù)定義偽指令dd(dword) / dq(qword) / dt(tbyte)依次說(shuō)明32/64/80位數(shù)據(jù);它們可以用于定義單精度、雙精度和擴(kuò)展精度浮點(diǎn)數(shù)。為了區(qū)別于整數(shù)定義,MASM 6.11建議采用REAL4、REAL8、REAL10定義單、雙、擴(kuò)展精度浮點(diǎn)數(shù),但不能出現(xiàn)純整數(shù)(其實(shí),整數(shù)后面補(bǔ)個(gè)小數(shù)點(diǎn)就可以了)。相應(yīng)的數(shù)據(jù)屬性依次是dword、qword、tbyte。另外,實(shí)常數(shù)可以用E表示10的冪。
·? 初始化浮點(diǎn)處理單元
????? 每當(dāng)執(zhí)行一個(gè)新的浮點(diǎn)程序時(shí),第一條指令都應(yīng)該是初始化FPU的指令finit。該指令清除浮點(diǎn)數(shù)據(jù)寄存器棧和異常,為程序提供一個(gè)“干凈”的初始狀態(tài)。否則,遺留在浮點(diǎn)寄存器棧中的數(shù)據(jù)可能會(huì)產(chǎn)生堆棧溢出。另一方面,浮點(diǎn)指令程序段結(jié)束,也最好清空浮點(diǎn)數(shù)據(jù)寄存器。
浮點(diǎn)寄存器:
浮點(diǎn)執(zhí)行環(huán)境的寄存器主要是8個(gè)通用數(shù)據(jù)寄存器和幾個(gè)專用寄存器,它們是狀態(tài)寄存器、控制寄存器、標(biāo)記寄存器等
8個(gè)浮點(diǎn)數(shù)據(jù)寄存器(FPU Data Register),編號(hào)FPR0 ~ FPR7。每個(gè)浮點(diǎn)寄存器都是80位的,以擴(kuò)展精度格式存儲(chǔ)數(shù)據(jù)。當(dāng)其他類型數(shù)據(jù)壓入數(shù)據(jù)寄存器時(shí),PFU自動(dòng)轉(zhuǎn)換成擴(kuò)展精度;相反,數(shù)據(jù)寄存器的數(shù)據(jù)取出時(shí),系統(tǒng)也會(huì)自動(dòng)轉(zhuǎn)換成要求的數(shù)據(jù)類型。
????? 8個(gè)浮點(diǎn)數(shù)據(jù)寄存器組成首尾相接的堆棧,當(dāng)前棧頂ST(0)指向的FPRx由狀態(tài)寄存器中TOP字段指明。數(shù)據(jù)寄存器不采用隨機(jī)存取,而是按照“后進(jìn)先出”的堆棧原則工作,并且首尾循環(huán)。向數(shù)據(jù)寄存器傳送(Load)數(shù)據(jù)時(shí)就是入棧,堆棧指針TOP先減1,再將數(shù)據(jù)壓入棧頂寄存器;從數(shù)據(jù)寄存器取出(Store)數(shù)據(jù)時(shí)就是出棧,先將棧頂寄存器數(shù)據(jù)彈出,再修改堆棧指針使TOP加1。浮點(diǎn)寄存器棧還有首尾循環(huán)相連的特點(diǎn)。例如,若當(dāng)前棧頂TOP=0(即ST(0) = PFR0),那么,入棧操作后就使TOP=7(即使ST(0) = PFR7),數(shù)據(jù)被壓入PFR7。所以,浮點(diǎn)數(shù)據(jù)寄存器常常被稱為浮點(diǎn)數(shù)據(jù)棧。
????? 為了表明浮點(diǎn)數(shù)據(jù)寄存器中數(shù)據(jù)的性質(zhì),對(duì)應(yīng)每個(gè)FPR寄存器,都有一個(gè)2位的標(biāo)記(Tag)位,這8個(gè)標(biāo)記tag0 ~ tag7組成一個(gè)16位的標(biāo)記寄存器。


