FSTENV, FNSTENV
存储 x87 FPU 环境
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
9B D9 /6 | FSTENV m14/28byte | 有效 | 有效 | 在检查待解密的 浮点 例外后, 将 FPU 环境存储到 m14 字节或 m28 字节。 然后掩盖所有 浮点 例外 。 | |
D9 /6 | FNSTENV1 m14/28byte | 有效 | 有效 | 将 FPU 环境存储到 m14 字节或 m28 字节, 不检查待解的浮点例外。 然后掩盖所有浮点例外 。 |
实测开销
正在从 arch-data 加载实测数据...
说明
将当前 FPU 运行环境保存在与目的操作指定的内存位置,然后掩盖所有浮点例外. FPU操作环境包括FPU控制词,状态词,标记词,指令指针,数据指针,以及最后一个操作码. Intel(R)64和IA-32架构软件开发者手册第1卷中的图8-9至8-12,根据处理器的操作模式(受保护或真实)和目前的操作数大小属性(16位或32位),显示存储环境的内存布局. 在虚拟 8086 模式中,使用真实模式布局.
FSTENV 指令检查和 句柄 任何待解密的 浮点 例外,在存储 FPU 环境之前; FNSTENV 指令没有. 保存的图像反映了FPU在指令流中FSTENV/FNSTENV指令之前的所有浮点指令已经执行之后的状态.
这些指令经常被例外处理器使用,因为它们提供了FPU指令和数据指针的访问. 环境一般保存在堆栈中. 保存环境后掩盖所有例外,防止浮点例外中断例外处理器.
组装器为FSTENV指令发布两个指令(一个FWAIT指令,然后是FNSTENV指令),处理器分别执行每个指令. 如果为其中任一指令生成例外,保存的EIP指导致例外的指令.
此指令的操作在非64位模式和64位模式中是相同的.
IA-32 架构兼容性
当在MS-DOS兼容模式下运行一个Pentium或Intel486处理器时,可以在FNSTENV指令执行到句柄之前中断一个待决的FPU例外. 参见Intel(R)64和IA-32架构软件开发者手册第1卷附录D中题为"No-wait FPU指令可以让 FPU干扰窗口"的章节,以说明这些情况. FNSTENV指令不能在后来的英特尔处理器上以这种方式中断,除了英特尔夸克TM X1000处理器.
行动
DEST[FPUControlWord] := FPUControlWord;
DEST[FPUStatusWord] := FPUStatusWord;
DEST[FPUTagWord] := FPUTagWord;
DEST[FPUDataPointer] := FPUDataPointer;
DEST[FPUInstructionPointer] := FPUInstructionPointer;
DEST[FPULastInstructionOpcode] := FPULastInstructionOpcode;
FPU Flags Affected
The C0, C1, C2, and C3 are undefined.浮点 例外
None.
异常
保护模式
#GP(0) | 如果目的地位于不可写入的区段中。如果内存操作数的有效地址位于CS、DS、ES、FS或GS区段限制之外,则使用DS、ES、FS或GS寄存器访问内存,并含有NULL 段选择子。 |
#SS(0) | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2] 或 CR0.TS[bit 3] = 1. |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. |
#NM | CR0.EM[bit 2] 或 CR0.TS[bit 3] = 1. |
#MF | 如果存在待决的x87 FPU例外. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |