FSTSW, FNSTSW

存储 x87 FPU 状态单词

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
9B DD /7FSTSW m2byte有效有效在检查待解密的 浮点 例外后, 将 FPU 状态单词存储于 m2字节 。
9B DF E0FSTSW AX有效有效在检查待解密的 浮点 例外后, 将 FPU 状态单词存储在 AX 登记簿中 。
DD /7FNSTSW1 m2byte有效有效将 FPU 状态单词存储于 m2字节, 不检查待解密的 浮点 例外 。
DF E0FNSTSW1 AX有效有效在 AX 寄存器中存储 FPU 状态单词, 不检查待解密的 浮点 例外 。

实测开销

正在从 arch-data 加载实测数据...

说明

在目标位置存储 x87 FPU 状态词的当前值。 目标操作数可以是双字节的内存位置,也可以是AX寄存器. FSTSW指令检查和句柄在保存状态词前待解密的浮点例外;FNSTSW指令没有.

指令的FNSTSW AX形式主要用于有条件的分支(例如,经过FPU比较指令或FPREM,FPREM1,或FXAM指令),其中分支的方向取决于FPU条件代码旗的状态. (参见英特尔(R)64和IA-32架构软件开发者手册第1卷第8章中标题为"FPU条件代码上的缓冲和有条件移动"的章节) 本指令也可以用于在不使用中断的环境下引用例外处理器(通过检查例外标记). FNSTSW AX指令执行时,在处理器执行任何进一步指令之前更新AX寄存器. 因此,AX登记册中存储的状态可以保证从先前的FPU指令完成时算起.

组装器为FSTSW指令发布两个指令(一个FWAIT指令,然后是FNSTSW指令),处理器分别执行每个指令. 如果为其中任一指令生成例外,保存的EIP指导致例外的指令.

此指令的操作在非64位模式和64位模式中是相同的.

IA-32 架构兼容性

当在MS-DOS兼容模式下运行一个Pentium或Intel486处理器时,可以在FNSTSW指令执行到句柄之前中断一个待决的FPU例外. 参见Intel(R)64和IA-32架构软件开发者手册第1卷附录D中题为"No-wait FPU指令可以让 FPU干扰窗口"的章节,以说明这些情况. FNSTSW指令不能在后来的英特尔处理器上以这种方式中断,除了英特尔夸克TM X1000处理器.

行动

DEST := FPUStatusWord;

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 段限制之外。
#NMCR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误.
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#UD如果使用 LOCK 前缀 。
实地址模式
#GP如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外.
#SS如果 内存操作数 的有效地址在 SS 段限制之外。
#NMCR0.EM[bit 2] 或 CR0.TS[bit 3] = 1.
虚拟 8086 模式
#GP(0)如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外.
#SS(0)如果 内存操作数 的有效地址在 SS 段限制之外。
#NMCR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误.
#AC(0)如果启用对齐检查, 并使用不对齐的内存引用 。
#UD如果使用 LOCK 前缀 。
兼容模式
与保护模式中的例外相同.
64 位模式
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址是非冠状的.
#NMCR0.EM[bit 2] 或 CR0.TS[bit 3] = 1.
#MF如果存在待决的x87 FPU例外. #PF(fault-code) 如果发生 页面错误.
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#UD如果使用 LOCK 前缀 。

来源