FXSAVE - 儲存 x87 FPU、MMX™ 技術、數據流單指令多數據擴充套件指令集、第二代數據流單指令多數據擴充套件指令集狀態

操作碼

指令

說明

0F AE /0

FXSAVE m512byte

將 x87 FPU、MMX™ 技術、“數據流單指令多數據擴充套件指令集”以及“第二代數據流單指令多數據擴充套件指令集”狀態儲存到 m512byte

說明

FXSAVE 指令將 x87 FPU、MMX™ 技術、“數據流單指令多數據擴充套件指令集”、“第二代數據流單指令多數據擴充套件指令集”的數據、控制及狀態暫存器的當前狀態寫入目標運算元。目標是 512 位元組記憶體位置。

此指令不檢查未決的無掩碼浮點異常(與 FNSAVE 的操作類似)。與 FSAVE/FNSAVE 指令不同,儲存狀態之後,處理器保留 x87 FPU、MMX 技術、數據流單指令多數據擴充套件指令集以及數據流單指令多數據擴充套件指令集狀態的內容。儲存數據結構(請參閱 FXSAVE 與 FXRSTOR 記憶體區域佈局)使用 little-endian(低位在先、高位在後)位元組順序,與記憶體中的安排一樣,位元組偏移量如每行最右側的列所述。

浮點儲存區域中有三個欄位包含保留位,這些位沒有在表中指出:

FOP:低 11 位包含操作碼,高 5 位保留。IP 與 DP 32 位模式:32 位 IP 偏移量。16 位模式:低 16 位是 IP 偏移量,高 16 位保留。

FXSAVE 指令通常用在以下場合:操作系統需要執行上下文切換,異常處理需要使用浮點、MMX 技術以及“數據流單指令多數據擴充套件指令集”單元。由於它會保留目前狀態,因此應用程式不能使用它向過程傳遞“乾淨的”FP 狀態。要提供此功能,應用程式必須在 FXSAVE 之後明確執行 FINIT 指令。

除 FTW 之外,所有的 x87 FPU 欄位都保留與 FSAVE 相同的內部格式。

與 FSAVE 不同,FXSAVE 只儲存 FTW 有效位,而不是整個 x87-FP FTW 欄位。FTW 位以非 TOS 相對順序儲存,這表示總是先儲存 FR0,然後是 FR1、FR2,依次類推。例如,如果 TOS=4,且只有 ST0、ST1 與 ST2 有效,則 FSAVE 會按以下格式儲存 FTW 欄位:

ST3 ST2 ST1 ST0 ST7 ST6 ST5 ST4 (TOS=4) FR7 FR6 FR5 FR4 FR3 FR2 FR1 FR0 11 xx xx xx 11 11 11 11

其中 xx 是 (00, 01, 10) 中的一個。(11) 表示空棧元素,00、01 及 10 分別表示“有效值”、“零”及“特殊值”。

在本例中,FXSAVE 會儲存以下向量:

FR7 FRits6 FR5 FR4 FR3 FR2 FR1 FR0 0 1 1 1 0 0 0 0

通過使用下表,FTW 的 FSAVE 格式可以根據 FTW 有效位與儲存的 80 位 FP 數據(假設儲存的數據不是 MMX 暫存器的內容)重新建立:

指數全 1

指數全 0

小數全 0

J 與 M 位

FTW 有效位

x87 FTW

0

0

0

0x

1

特殊

10

0

0

0

1x

1

有效

00

0

0

1

00

1

特殊

10

0

0

1

10

1

有效

00

0

1

0

0x

1

特殊

10

0

1

0

1x

1

特殊

10

0

1

1

00

1

01

0

1

1

10

1

特殊

10

1

0

0

1x

1

特殊

10

1

0

0

1x

1

特殊

10

1

0

1

00

1

特殊

10

1

0

1

10

1

特殊

10

上述所有的有效組合

0

11

J 位定義為有效位中小數點位置左側的一位二進制整數。M 位定義為有效位中小數部分的最高有效位(即正好在小數點右側的位)。

M 位是有效位中小數部分的最高有效位時,如果小數部分全零,則 M 位必須是 0。

如果 FXSAVE 指令的前一條指令是不使用記憶體運算元的浮點指令,則 FXSAVE 指令不會將 DP 欄位寫入/更新到 FXSAVE 映像。

MXCSR 儲存 SIMD 浮點“控制/狀態暫存器”的內容。如需有關此欄位的詳細說明,請參閱 LDMXCSR 指令。

欄位 XMM0-XMM7 包含暫存器 XMM0-XMM7 的內容,格式與在暫存器中完全相同。

如果未設定 CR4.OSFXSR 位,則處理器不將儲存映像中的“數據流單指令多數據擴充套件指令集”欄位(XMM0-XMM7 與 MXCSR)加以儲存。這個 CR4 位必須設定,才能執行“數據流單指令多數據擴充套件指令集”。

目標 m512byte 假設與 16 位元組邊界對齊。如果 m512byte 未與 16 位元組邊界對齊,FXSAVE 會產生一般保護性異常。

操作

m512byte FP and MMX™ technology state and Streaming SIMD Extension state;

數值異常

無效、精度。

保護模式異常

#GP(0) - CS、DS、ES、FS 或 GS 段中的記憶體運算元有效地址非法。如果記憶體運算元未對齊 16 位元組邊界,不論是哪一段。

#SS(0) - SS 段中的地址非法。

#PF(錯誤程式碼) - 頁錯誤。

#NM - 如果 CR0.EM 1。

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

#UD - 如果指令帶 LOCK 覆蓋字首

#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。如果啟用 #AC(且 CPL 為 3),則發出 #AC 訊號所表示的含義是不確定的,隨具體版本而異。在不發出 #AC 訊號的所有版本中,將產生一般保護性錯誤,而不是發出訊號。此外啟用 #AC 時,對齊檢查的寬度也隨具體版本而異;例如,對於給定的版本,在發生 2 位元組未對齊時,可能會發出 #AC 訊號,而發生其它未對齊(4、8 或 16 位元組)情況時,則可能會發出 #GP 訊號。

實地址模式異常

#GP(0) - 如果記憶體運算元未對齊 16 位元組邊界,不論是哪一段。

中斷 13 - 如果運算元的任何部分出現在從 0 到 0FFFFH 的有效地址空間之外。

#NM - 如果 CR0.EM 1。

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

#UD - 如果指令帶 LOCK 覆蓋字首

虛 8086 模式異常

與“實地址模式”中的異常相同。

#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。

#PF(錯誤程式碼) - 頁錯誤。

註釋

使用 FXSAVE 儲存並使用 FRSTOR 還原狀態,以及使用 FSAVE 儲存並使用 FXRSTOR 還原狀態,都將導致處理器的狀態無法正確還原。地址大小字首對地址計算的影響跟通常情況一樣,但它不會影響 FXSAVE 映像的格式。

配合 Repeat(F2H, F3H) 與“運算元大小”(66H) 字首使用 FXSAVE 屬於保留用法。不同的處理器版本處理這些字首的方式可能會有所不同。配合這些字首使用 FXSAVE 可能會同將來的處理器不相容。