操作碼 |
指令 |
說明 |
9B DD /6 |
FSAVE m94/108byte |
在檢查未決的無掩碼浮點異常之後,將 FPU 狀態儲存到 m94byte 或 m108byte。然後重新初始化 FPU。 |
DD /6 |
FNSAVE* m94/108byte |
將 FPU 環境儲存到 m94byte 或 m108byte,不檢查未決的無掩碼浮點異常。然後重新初始化 FPU。 |
將目前的 FPU 狀態(操作環境與暫存器堆疊)儲存到記憶體中指定的目標,然後重新初始化 FPU。在儲存 FPU 狀態之前,FSAVE 指令檢查並處理未決的無掩碼浮點異常,FNSAVE 指令則不會。
FPU 操作環境由 FPU 控制字、狀態字、標記字、指令指針、數據指針以及上一個操作碼組成。“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷的“圖 7-13”到“圖 7-16”顯示儲存的環境在記憶體中的佈局,具體取決於處理器的操作模式(保護模式或真實模式)以及目前的運算元大小屬性(16 位或 32 位)。在虛 8086 模式中,使用真實模式佈局。FPU 暫存器堆疊的內容儲存在緊跟操作環境映像之後的 80 個位元組中。
儲存的映像反映的是,FPU 在指令流中 FSAVE/FNSAVE 指令前面的所有浮點指令都執行之後的狀態。
已經儲存 FPU 狀態之後,FPU 復位成使用 FINIT/FNINIT 指令設定的相同預設值(請參閱本章中的 FINIT/FNINIT - 初始化浮點單元)。
FSAVE/FNSAVE 指令通常用在以下場合:操作系統需要執行上下文切換,異常處理需要使用 FPU,或是應用程式需要向過程傳遞“乾淨的”FPU。
對於英特爾(R) 奔騰(R) 處理器之前的英特爾數學協處理器與 FPU,在試圖讀取前面的 FSAVE/FNSAVE 指令儲存的記憶體映像之前,應該先執行 FWAIT 指令。這個 FWAIT 指令有助於確保儲存操作已經完成。
在 MS-DOS* 操作系統相容模式中操作奔騰或 Intel486™ 處理器時,FNSAVE 指令(在特殊的情況下)可能會在執行(以便處理未決的 FPU 異常)之前中斷。如需有關這些情況的說明,請參閱“IA-32 英特爾體系結構軟件開發人員手冊”第 1 卷附錄 D 中標題為“無等待 FPU 指令可以在視窗中發生 FPU 中斷”的部分。在奔騰 Pro 處理器上,FNSAVE 指令不能以此方式中斷。
(* Save FPU State and Registers *)
DEST[FPUControlWord) FPUControlWord;
DEST[FPUStatusWord) FPUStatusWord;
DEST[FPUTagWord) FPUTagWord;
DEST[FPUDataPointer) FPUDataPointer;
DEST[FPUInstructionPointer) FPUInstructionPointer;
DEST[FPULastInstructionOpcode) FPULastInstructionOpcode;
DEST[ST(0)) ST(0);
DEST[ST(1)) ST(1);
DEST[ST(2)) ST(2);
DEST[ST(3)) ST(3);
DEST[ST(4)) ST(4);
DEST[ST(5)) ST(5);
DEST[ST(6)) ST(6);
DEST[ST(7)) ST(7);
(* Initialize FPU *)
FPUControlWord 037FH;
FPUStatusWord 0;
FPUTagWord FFFFH;
FPUDataPointer 0;
FPUInstructionPointer 0;
FPULastInstructionOpcode 0;
儲存 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。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。