浮點指令系統

浮點指令系統

x87 FPU具有自己的指令系統,共有幾十種浮點指令,指令助記符均以F開頭。浮點指令系統包括了常用的指令類型:浮點傳送指令、浮點算術運算指令、浮點超越函式指令、浮點比較指令和FPU控制指今。

概述

浮點指令一般需要1個或2個運算元,數據存於浮點數據暫存器或主存中(不能是立即數),主要有3種定址方式。

1、隱含定址:運算元在當前數據暫存器頂ST(0)。許多浮點指令的一個隱含(目的)運算元是ST(0);彙編格式中ST等同於ST(0)。這是堆疊結構下運算元的一個特點,常使得彙編語言程式設計師感到困惑,增加了編寫浮點指令程式的難度。

2、暫存器定址:運算元在指定的數據暫存器棧中ST(i);其中i是相對於當前棧頂ST(0)而言,即i=0~7。

3、存儲器定址:運算元在主存中;主存中的數據可以採用任何存儲器定址方式。

浮點傳送指令

浮點數據傳送指令完成主存與棧頂ST(0)、數據暫存器ST(i)與棧頂之間的浮點格式數據的傳送。浮點數據暫存器是一個首尾相接的堆疊,所以它的數據傳送實際上是對堆疊的操作,有些要改變堆疊指針TOP,即修改當前浮點數據暫存器棧頂。

取數指令

取數指令FLD從存儲器或浮點數據暫存器取得(Load)數據,壓入(Push)暫存器棧頂ST(0)。“壓棧”的操作是,使棧頂指針TOP減1,數據進入新的棧頂ST(0)。

壓棧操作改變了指針TOP指向的數據暫存器,即原來的ST(0)成為現在的ST(1)、原ST(1)為現ST(2)……其他浮點指令實現數據進入暫存器棧都伴隨有這個壓棧操作。數據進入暫存器棧前由浮點處理單元自動轉換成擴展精度浮點數。

存數指令

存數指令FST將浮點數據暫存器棧頂數據存入(Store)主存或另一個浮點數據暫存器,暫存器棧沒有變化。數據取出後按要求格式自動轉換,並在狀態暫存器中設定相應異常標誌。

存數且出棧指令

存數且出棧指令FSTP除執行相應存數指令功能外,還要彈出(Pop)棧頂。“出棧”的操作是:將棧頂ST(O)清空(使對應的標記位等於llB),並使TOP指針加1。

出棧操作改變了指針TOP指向的數據暫存器,即原來的ST(1)成為現在的ST(0)、原ST(2)為現ST(1)……浮點指令集中還有一些這樣的執行“出棧”操作的指令,它們的指令助記符都是用P結尾。浮點數據傳送指令有一組常數傳送指令,它們將浮點運算過程中經常使用的常數按擴展精度壓入暫存器棧頂ST(0),例如傳送0、1、π等常數的浮點指令依次是FLDZ、FLDl、FLDPI。

浮點交換指令FXCH實現棧頂ST(0)與任一個暫存器ST(i)之間的數據交換。由於許多浮點指令只對棧頂操作,有了這個交換指令,就可以比較方便地對其他數據暫存器單元進行操作了。

其他浮點指令

浮點算術運算指令實現浮點數據的加(FADD)、減(FSUB)、乘(FMUL)、除(FDIV)運算,還包括求絕對值(FABS)、求平方根(FSQRT)和取整(FRNDINT)等指令。

浮點超越函式指令對實數求三角函式、指數和對數等運算,有計算正切(FPTAN)、反正切(FPATAN)、正弦(FSIN)、餘弦(FCOS)、正弦和餘弦(FSINCOS)、指數(F2XM1)、對數(FYL2X)等指令。

浮點比較指令比較棧頂數據與指定的源運算元,比較結果通過浮點狀態暫存器反映。例如,檢查浮點數據類型(FXAM)、與零比較(FTST)、浮點數比較指令(FCOM)等指令。

FPU控制指令用於控制和檢測浮點處理單元的狀態及操作方式。例如,FPU初始化(FINIT)、浮點空操作(FNOP)、保存浮點狀態(FSAVE)、設定浮點狀態(FRSTOR)等指令。

相關詞條

熱門詞條

聯絡我們