汇编 x87-FPU寄存器 指令简介

FPU 寄存器是浮点处理器单元中的寄存器,用于执行浮点运算。支持32位 和64位浮点数据运算使用独立的栈用于运算

专用寄存器
操作码寄存器保存最后指向的非控制指令的操作码11 bit
控制寄存器运算时,控制精度及舍入方法,隐藏各个浮点异常16 bit
状态寄存器包含栈顶指针,条件码,以及异常警告16 bit
标志寄存器指明栈内每个寄存器的内容16 bit
指针寄存器保存指向最后执行的非控制指令指针47 bit
数据指针 保存指向最后执行指令所使用的数据指针47 bit
单精度32位,1个符号位(最高位),8位阶数(23~30),23位小数部分(0-~22)
双精度64位,,1个符号位(最高位),11位阶数(52~63),52位小数部分(0~51)
扩展双进度80位,,1个符号位(最高位),1位整数部分,15位阶数,63位小数部分

控制寄存器字段图

        RC: 舍入控制

                00: 舍入到最近的偶数; 01: 向负无穷舍入;10: 向正无穷舍入;11: 向0舍入(截断)

    浮点异常: IM:无效操作,ZM:用0 除,DM:非规格化操作数,OM:数据上溢,UM:数据下溢,PM:不确定精度

数据传输指令(data Transfer Instructions)
FINIT 对FPU 进行初始化,FINIT 037FH(100101) 隐藏素浮点异常,舍入模式为最近偶数
FLD

FLD m32fp/ m64fp/ m80fp/

FLD ST(i): Copy ST(0) to ST(i).

加载浮点值,复制操作数到栈顶(ST0)

FST

FST m32fp/m64fp

将栈顶复杂到内存中,Copy ST(0) to m32fp/m64fp

FSTP

FSTP m32fp/m64fp/m80fp/

FSTP ST(i):  Copy ST(0) to ST(i) and pop register stack.

将栈顶复杂到内存中,并将ST0弹出堆栈,修改ST0的位置  

Copy m32fp/m64fp/m80fp/ to m32fp and pop register stack.

FILD

FILD m16int/m32int/m64int

指令将一个整数值加载到浮点数寄存器ST(0)中

加载整数,复制操作数到栈顶(ST0)

FIST

FIST m16int/m32int/m64int

存储整数

指令将浮点数寄存器ST(0)中的值舍入为整数,并将结果存储到指定的整数寄存器或内存位置中

FISTP

FISTP m32int/m64int 

将ST(0)存储在m32int/m64int中并弹出寄存器堆栈。

FBLD

FBLD m80bcd

将BCD(二进制编码的十进制)数值加载到FPU(浮点处理器单元)的寄存器中

FBSTP

FBSTP m80bcd

将ST(0)存储在m80bcd中,然后弹出ST(O)。

FXCH

FXCH ST(i) :交换ST(0)和ST(i)的内容。

FXCH: 交换ST(0)和ST(1)的内容。

用于交换FPU(浮点处理器单元)的栈顶部分和次栈顶部分的两个浮点数值

FCMOVEFCMOVE ST(0), ST(i) ,如果相等 Move if equal (ZF=1).
FCMOVNEFCMOVNE ST(0), ST(i) 如果不相等 Move if not equal (ZF=0).
FCMOVBFCMOVB ST(0), ST(i) 如果低于 Move if below (CF=1)
FCMOVBEFCMOVBE ST(0), ST(i) 如果低于或等于 Move if below or equal (CF=1 or ZF=1).
FCMOVNBFCMOVNB ST(0), ST(i) 如果不低于 Move if not below (CF=0).
FCMOVNBEFCMOVNBE ST(0), ST(i) 如果不低于或等于  Move if not below or equal (CF=0 and ZF=0).
FCMOVUFCMOVU ST(0), ST(i) 如果无序 Move if unordered (PF=1).
FCMOVNUFCMOVNU ST(0), ST(i) 如果不是无序的 Move if not unordered (PF=0)

 Basic Arithmetic Instructions 基本运算指令
FADD

FADD m32fp / FADD m64fp :Add m32fp/m64fp to ST(0) and store result in ST(0).

FADD ST(0), ST(i)  : Add ST(0) to ST(i) and store result in ST(0).

FADD ST(i), ST(0): Add ST(i) to ST(0) and store result in ST(i)

FADDPFADDP ST(i), ST(0): 相加,并将结果存储回ST(i)中,同时从FPU栈中弹出ST(0)。
FIADD

FIADD m32int / FIADD m16int

 Add m32int/m16int to ST(0) and store result in ST(0).

FSUB

FSUB:从ST(1)中减去ST(0),将结果存储在ST1 弹出寄存器堆栈。

FSUB m32fp / FADD m64fp : 从ST(0)中减去m32fp/m64fp,并将结果存储在ST(1)中。

FSUB ST(0), ST(i)  : 从ST(0)中减去ST(i),并将结果存储在ST(O)中。

FSUB ST(i), ST(0): 从ST(i)中减去ST(0),并将结果存储在ST(ⅰ)中。

FSUBP

 FSUBP ST(i), ST(0) : 从ST(i)中减去ST(0),将结果存储在ST(i),并弹出寄存器堆栈。

FSUBP:从ST(1)中减去ST(0),将结果存储在ST(0),弹出寄存器堆栈。

FISUBFISUB m32int/m64fp: 从ST(0)中减去m32int,并将结果存储在ST(1)中。
FSUBR

FSUBR m32fp/m64fp: 从m32fp/m64fp中减去ST(0),并将结果存储在ST(1)中。

FSUBR ST(0), ST(i): 从ST(i)中减去ST(0),并将结果存储在ST(O)中。

FSUBR ST(i), ST(0): 从ST(0)中减去ST(i),并将结果存储在ST(i)中。

FSUBRP

FSUBRP ST(i), ST(0):从ST(0)中减去ST(i),将结果存储在ST(i),弹出寄存器堆栈。

FSUBRP:从ST(0)中减去ST(1),将结果存储在ST(1),弹出寄存器堆栈。

FISUBRFISUBR m32int/m64int: 从m32int/m64int中减去ST(0),并将结果存储在ST(1)中。
FMUL

FMUL: 将ST0 * ST1,结果存储在ST1中,并弹出堆栈

FMUL m32fp/m64fp: ST0 *m32fp/m64fp  并将结果存储回ST(0)中

FMUL ST(0), ST(i): ST(0) * ST(i) 并将结果存储回ST(0)中

FMUL ST(i), ST(0): ST(0) * ST(i) 并将结果存储回ST(i)中

FMULPFMULP  ST(i): ST(0): ST(0) * ST(i);保存在ST(i)中,并弹出ST(0)
FIMULFIMUL m32fp/m64fp:  MUL m32int/m16int to ST(0) and store result in ST(0).
FDIV

 FDIV m32fp / FDIV m64fp:Divide ST(0) by m32fp /m64fpand store result in ST(0).

FDIV ST(0), ST(i) :Divide ST(0) by ST(i) and store result in ST(0).

FDIV ST(i), ST(0): Divide ST(i) by ST(0) and store result in ST(i).

FDIVP

FDIVP:将ST(1)中的值除以ST(0)中的值,并将结果存储回ST(1)中。接着,使用FSTP ST(0)指令将栈顶的数值弹出

FDIVP ST(i), ST(0) :Divide ST(i) by ST(0), store result in ST(i), and pop the register stack.

将ST(i)除以ST(0),将结果存储在ST(i)中,然后弹出寄存器堆栈。

FIDIV FIDIV m32int/m16int 将ST(0)除以m32int/m16int,并将结果存储在ST(0)中。
FDIVR

FDIVR m32fp/m64fp 将m32fp/m64fp除以ST(0),并将结果存储在ST中(0)。

FDIVR ST(0), ST(i) 将ST(i)除以ST(0),并将结果存储在ST(零)中。

FDIVR ST(i), ST(0) 将ST(0)除以ST(i),并将结果存储在ST(i)中。

FDIVRP

FDIVRP ST(i), ST(0) 将ST(0)除以ST(i),将结果存储在ST(i)寄存器堆栈。

FDIVRP 将ST(0)除以ST(1),将结果存储在ST(1)寄存器堆栈。

FIDIVRFIDIVR m32int/m16int 将 m32int/m16int 除以ST(0),并将结果存储在ST(1)中。
FPREM

Replace ST(0) with the remainder obtained from dividing ST(0) by ST(1).

用除法得到的余数替换ST(0),ST(0)乘以ST(1)。

FPREM

Replace ST(0) with the IEEE remainder obtained from dividing ST(0) by ST(1)

用ST(0)除以ST(1)所得的IEEE余数替换ST(0

FABS

 Replace ST with its absolute value.

将ST(0)替换为其绝对值。

FCHS会将浮点寄存器ST(0)中的值取负,并将结果存储回ST(0)中
FRNDINT

 Round ST(0) to an integer.

将(ST0)浮点数四舍五入为最接近的整数,并将结果存储回ST(0)中。

FSCALE

 Scale ST(0) by ST(1)

将ST(0)中的值乘以2的n次方,其中n是ST(1)中的整数部分,并将结果存储回ST(0)中。

FSQRT计算浮点数的平方根,并将结果存储回ST(0)中
FXTRACT

Separate value in ST(0) into exponent and significand, store exponent in ST(0), and push the significand onto the register stack.

将ST(0)中的值分离为指数和有效位,存储ST(0)中的指数,并将有效位推送到寄存器堆栈

 Comparison Instructions: 对比指令
FCOM

FCOM: 比较ST(0) 与ST(1)

FCOM m32fp/m64fp: 比较ST(0) 与m32fp/m64fp

FCOM ST(i)  比较ST(0) 与 ST(i) 

将ST(0)中的值与指定的值进行比较,并设置FPU状态字中的条件码以反映比较的结果。可能会影响FPU栈的状态,会处理NaN的情况

FCOMP

FCOMP : 比较ST(0) 与ST(1)

FCOMP m32fp/m64fp :比较ST(0) 与m32fp/m64fp

FCOMP ST(i):  比较ST(0) 与 ST(i) 

设置FPU状态字中的条件码以反映比较结果,并从FPU栈中移除ST(0)中的值

FCOMPP

Compare ST(0) with ST(1) and pop register stack twice.

将ST(0)与ST(1)进行比较并弹出寄存器堆栈两次

FUCOM

FUCOMI ST(0), ST(i) 比较无序浮点数寄存器ST(0)中的值与另一个浮点数或内存中的浮点数

 将ST(0)与ST(i)进行比较,检查有序值,然后设置相应的状态标志

无序浮点数是指在比较过程中,其中一个或两个操作数为NaN(非数)的情况

FUCOMIP

FUCOMIP ST(0), ST(i) 比较ST(0)和ST(i),检查有序值,设置 相应的状态标志,并弹出寄存器堆栈。

FUCOMP

FUCOMP ST(i)

比较无序浮点数寄存器ST(0)中的值与另一个浮点数或内存中的浮点数,并弹出栈顶元素

FUCOMPP

FUCOMPP:将ST(0)与ST(1)进行比较,并弹出寄存器堆栈两次

FICOMFICOM m32int/m64int: 将ST(0)与m16int/m64int进行比较。并设置FPU状态字中的条件码以反映比较的结果
FICOMPFICOMP m32int/m64int:  将ST(0)与m16int/m64int进行比较,然后弹出堆栈寄存器。,并设置FPU状态字中的条件码以反映比较的结果
FCOMI

FCOMI ST(0), ST(i)

比较浮点数寄存器ST(0)中的值与另一个浮点数或内存中的浮点数,并将比较结果更新到EFLAGS寄存器中,不会改变FPU栈的状态,它不处理NaN(非数)情况

FUCOMI

FCOMIP ST(0), ST(i)

将ST(0)与ST(i)进行比较,检查有序值,然后设置相应的状态标志。

FCOMIP

FCOMIP ST, ST(i)

将ST(0)与ST(i)进行比较,相应地设置状态标志,以及弹出寄存器堆栈。

FTSTFTST:将ST(0)中的值与零进行比较,并设置FPU状态字中的条件码以反映比较的结果
FXAM检查浮点数寄存器ST(0)中的值,并确定其类型(非规格化数、规格化数、无穷大、非数)。这个指令会设置FPU状态字中的条件码以反映ST(0)中值的类型

Control Instructions:控制器指令
FINCSTP增加FPU状态寄存器中的TOP字段。
FDECSTP递减FPU寄存器堆栈指针。
FFREEFree x87 FPU register.
FINIT在检查错误条件后初始化FPU。
FNINIT在不检查错误条件的情况下初始化FPU。
FCLEX在检查错误条件后清除浮点异常标志。
FNCLEX清除浮点异常标志,而不检查错误情况。
FSTCW在检查错误条件后存储FPU控制字。
FNSTCW在不检查错误条件的情况下存储FPU控制字。
FLDCW

 FLDCW m2byte

加载FPU控制字。

FSTENV

FSTENV m14/28byte

存储FPU环境检查错误条件后。

FNSTENV

FNSTENV1 m14/28byte

存储FPU环境,无需检查错误条件。

FLDENV

 FLDENV m14/28byte

加载FPU环境。

FSAVE

FSAVE m94/108byte

检查错误条件后保存FPU状态。

FNSAVE

FNSAVE m94/108byte

保存FPU状态而不检查错误条件。

FRSTOR

FRSTOR m94/108byte (94 或108 字节)

恢复FPU状态。

FSTSW

FSTSW m2byte

FSTSW AX

在检查错误条件后存储FPU状态字。

FNSTSW

FNSTSW  m2byte

NSTSW  AX

在不检查错误条件的情况下存储FPU状态字。

WAIT/FWAIT 等待FPU。
FNOPFPU无操作
Transcendental  Instructions
FSIN用于计算浮点数寄存器ST(0)中的值的正弦,并将结果存储回ST(0)中。
FCOSFCOS指令用于计算浮点数寄存器ST(0)中的值的余弦,并将结果存储回ST(0)中
FSINCOS同时计算浮点数寄存器ST(0)中的值的正弦和余弦,并将结果存储回ST(0)和ST(1)中
FPTAN计算浮点数寄存器ST(0)中的值的正切,并将结果存储回ST(0)中。
FPATAN计算浮点数寄存器ST(1)中的值除以ST(0)中的值的反正切,并将结果存储回ST(1)中
F2XM1

Replace ST(0) with (2ST(0) – 1)

用于计算2的x次方减1,其中x是浮点数寄存器ST(0)中的值

FYL2X

Replace ST(1) with (ST(1) ∗ log2ST(0)) and pop the register stack.

计算以2为底的对数乘以浮点数寄存器ST(0)中的值,并将结果存储回ST(1)中

FYL2XP1

Replace ST(1) with ST(1) ∗ log2(ST(0) + 1.0) and pop the register stack.

指令用于计算以2为底的对数乘以浮点数寄存器ST(0)中的值加1,并将结果存储回ST(1)中

加载常量说明
FLD1常数1.0加载到浮点数寄存器ST(0)中。
FLDZ将常数0.0加载到浮点数寄存器ST(0)中。
FLDPI将π加载到浮点数寄存器ST(0)中。
FLDL2E将以2为底的对数e(L2E)加载到浮点数寄存器ST(0)中。
FLDLN2将以e为底的对数2(LN2)加载到浮点数寄存器ST(0)中。
FLDL2T用于将以2为底的对数10(L2T)加载到浮点数寄存器ST(0)中。
FLDLG2用于将以10为底的对数2(LG2)加载到浮点数寄存器ST(0)中。
FPU和SIMD状态管理指令
FXSAVE

 

(32位) FXSAVE m512byte

(64位) FXSAVE64 m512byte

用于保存FPU(浮点处理器单元)的状态到内存中,包括寄存器状态、控制字、标志字等信息

FXRSTOR

(32位) FXRSTOR m512byte

(64位) FXRSTOR64 m512byte

用于从内存中恢复之前保存的FPU(浮点处理器单元)状态,包括寄存器状态、控制字、标志字等信息

  • 42
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值