FIST, FISTP

存储整数

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
DF /2FIST m16int有效有效在m16int中存储ST(0).
DB /2FIST m32int有效有效在m32int中存储ST(0).
DF /3FISTP m16int有效有效在m16int和pop寄存器堆栈中存储ST(0).
DB /3FISTP m32int有效有效在m32int和pop寄存器堆栈中存储ST(0).
DF /7FISTP m64int有效有效在m64int和pop寄存器堆栈中存储 ST( 0).

实测开销

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

说明

FIST指令将ST(0)寄存器中的值转换为签名整数,并存储结果为目标操作数. 值可以用单词或双词整数格式存储. 目标操作数指定了要存储目的地值的第一个字节的地址.

FISTP指令执行与FIST指令相同的操作,然后弹出寄存器堆栈. 要弹出寄存器堆栈,处理器将ST(0)寄存器标记为空,并将 栈指针 (TOP) 递增为 1 。 FISTP指令也以四字整数格式存储值.

下表显示以整数格式存储各类数字时获得的结果.

FIST/FISTP 结果

-或 DEST 格式的值太大*
F -1-I
-1 < F < -0**
-00
+00
+0<F<+1**
F+1+I
+或 DEST 格式的值太大*
纳恩*

行动

DEST := Integer(ST(0));

IF Instruction = FISTP

    THEN
          PopRegisterStack;

FI;

FPU Flags Affected

C1                         Set to 0 if stack underflow occurred.

                           Indicates rounding direction of if the inexact exception (#P) is generated: 0 := not roundup; 1
                           := roundup.

                           Set to 0 otherwise.

C0, C2, C3                 Undefined.

浮点 例外

#IS                        Stack underflow occurred.
#IA                        Converted value is too large for the destination format.

源操作数是一种SNaN,QNaN,+/-,或不支持的格式.

#P                         Value cannot be represented exactly in destination format.

异常

保护模式
#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.
#UD如果使用 LOCK 前缀 。
虚拟 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 前缀 。

来源