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