fild flds 浮点数 汇编指令

FILD FLDS

汇编 fld

FPU

FPU 不使用通用寄存器。拥有独立的一组寄存器,称为寄存器栈。

FPU 执行方式

内存中数据加载到寄存器栈,计算后再将寄存器栈数值保存到内存中。

  1. 在汇编代码中操作数:
    D9 -> FLD m32fp 将m32的float pointer 压入FPU 寄存器栈
    DD -> FLD m64fp
    DB -> FLD m80fp
    D9 C0+i FLD ST(i)
    PS:ST 表示——寄存器栈
    例如:

指令使用后缀表达式:

中缀表达式:(A+B)C 后缀表达式:AB+C (编译原理)

FPU 数据寄存器

  • FPU 有 8 个独立的、可寻址的 80 位数据寄存器 R0〜R7(寄存器栈) 如图

  • FPU 中名字为TOP的一个三位字段给出了当前栈顶的寄存器编号。在上图中 TOP=011(2)表示栈顶为R3在编写浮点指令时,这个位置也称为ST(0)或简写为ST,最后一个寄存器位ST(7).

出栈入栈以及异常

  • 入栈(push)操作(也称为加载)将 TOP 减 1,并把操作数复制到标识为 ST(0) 的寄存器中。如果在入栈之前,TOP 等于 0,那么 TOP 就回绕到寄存器 R7。
  • 出栈(pop)操作(也称为保存)把 ST(0) 的数据复制到操作数,再将TOP加1。如果在出栈之前,TOP 等于 7,则 TOP 就回绕到寄存器 R0。
  • 如果加载到堆栈的数值覆盖了寄存器栈内原有的数据,就会产生一个浮点异常(floating-point exception)。
  • 寄存器中浮点数使用的是 IEEE 10 字节扩展实数格式(也被称为临时实数(temporary real))。当 FPU 把算术运算结果存入内存时,它会把结果转换成如下格式之一:整数、长整数、单精度(短实数)
    、双精度(长实数),或者压缩二进制编码的十进制数(BCD)

专用寄存器

FPU 有 6 个专用(special-purpose)寄存器,如下图所示:

  • FPU专用寄存器
  • 操作码寄存器:保存最后执行的非控制指令的操作码。
  • 控制寄存器:执行运算时,控制精度以及 FPU 使用的舍入方法。还可以用这个寄存器来屏蔽(隐藏)单个浮点异常。
  • 状态寄存器:包含栈顶指针、条件码和异常警告。
  • 标识寄存器:指明 FPU 数据寄存器栈内每个寄存器的内容。其中,每个寄存器都用两位来表示该寄存器包含的是一个有效数、零、特殊数值 (NaN、无穷、非规格化,或不支持的格式 ),还是为空。
  • 最后指令指针寄存器:保存指向最后执行的非控制指令的指针。
  • 最后数据(操作数)指针寄存器:保存指向数据操作数的指针,如果存在,那么该数被最后执行的指令所使用。

参考链接:

https://www.felixcloutier.com/x86/fld
http://c.biancheng.net/view/3823.html

原文地址:https://www.cnblogs.com/oBYBo/p/13047613.html