FSTENV/FNSTENV - 儲存 x87 FPU 環境

操作碼

指令

說明

9B D9 /6

FSTENV m14/28byte

檢查未決的無掩碼浮點異常之後,將 FPU 環境儲存到 m14bytem28byte。然後設定所有浮點異常的掩碼。

D9 /6

FNSTENV* m14/28byte

將 FPU 環境儲存到 m14bytem28byte,不檢查未決的無掩碼浮點異常。然後設定所有浮點異常的掩碼。

說明

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

在儲存 FPU 環境之前,FSTENV 指令檢查並處理未決的任何無掩碼浮點異常,FNSTENV 指令則不會。儲存的映像反映指令流中 FSTENV/FNSTENV 指令前面的所有浮點指令執行之後的 FPU 狀態。

由於這些指令能夠訪問 FPU 指令與數據指針,因此常常用在異常處理程式中。環境通常儲存在堆疊中。通過在儲存環境之後設定所有異常的掩碼,可以防止浮點異常中斷異常處理程式。

英特爾(R) 體系結構相容性

在 MS-DOS* 操作系統相容模式中操作奔騰® 或 Intel486™ 時,FNSTENV 指令(在特殊的情況下)可能會在執行(以處理未決的 FPU 異常)之前中斷。如需有關這些情況的說明,請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷附錄 D 中標題為“無等待 FPU 指令可以在視窗中發生 FPU 中斷”的部分。在奔騰 Pro 處理器上,FNSTENV 指令不能以此方式中斷。

操作

DEST[FPUControlWord) FPUControlWord;
DEST[FPUStatusWord) FPUStatusWord;
DEST[FPUTagWord) FPUTagWord;
DEST[FPUDataPointer) FPUDataPointer;
DEST[FPUInstructionPointer) FPUInstructionPointer;
DEST[FPULastInstructionOpcode) FPULastInstructionOpcode;

影響的 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) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。