FRSTOR - 還原 x87 FPU 狀態

操作碼

指令

說明

DD /4

FRSTOR m94/108byte

m94bytem108byte 中載入 FPU 狀態。

說明

從源運算元指定的記憶體區域載入 FPU 狀態(操作環境與暫存器堆疊)。此狀態數據通常由前一條 FSAVE/FNSAVE 指令寫入指定的記憶體位置。

FPU 操作環境由 FPU 控制字、狀態字、標記字、指令指針、數據指針以及上一個操作碼組成。“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷的“圖 7-13”到“圖 7-16”顯示儲存的環境在記憶體中的佈局,具體取決於處理器的操作模式(保護模式或真實模式)以及目前的運算元大小屬性(16 位或 32 位)。在虛 8086 模式中,使用真實模式佈局。FPU 暫存器堆疊的內容儲存在緊跟操作環境映像之後的 80 個位元組中。

FRSTOR 指令應該與相應的 FSAVE/FNSAVE 指令在相同的操作模式中執行。

如果在新的 FPU 狀態字中設定一個或多個無掩碼異常位,則產生浮點異常。要避免在載入新的操作環境時觸發異常,請清除載入的 FPU 狀態字中的所有異常標誌。

操作

FPUControlWord SRC[FPUControlWord);
FPUStatusWord SRC[FPUStatusWord);
FPUTagWord SRC[FPUTagWord);
FPUDataPointer SRC[FPUDataPointer);
FPUInstructionPointer SRC[FPUInstructionPointer);
FPULastInstructionOpcode SRC[FPULastInstructionOpcode);
ST(0) SRC[ST(0));
ST(1) SRC[ST(1));
ST(2) SRC[ST(2));
ST(3) SRC[ST(3));
ST(4) SRC[ST(4));
ST(5) SRC[ST(5));
ST(6) SRC[ST(6));
ST(7) SRC[ST(7));

影響的 FPU 標誌

載入 C0、C1、C2 及 C3 標誌。

浮點異常

無;不過對於已檢測出但因為設定了掩碼而未產生的現有異常,此操作可能會取消該異常的掩碼。這裡,異常在指令完成時產生。

保護模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS、或 GS 暫存器用於訪問記憶體,並且它包含空的段選擇器。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

#GP - 如果記憶體運算元的有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS - 如果記憶體運算元有效地址超出 SS 段限制。

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

虛 8086 模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。