zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C# 排序技术研究与对比
    基于.net的通用内存缓存模型组件
    Scala学习笔记:重要语法特性
    一个初学者的指南,使用D3做数据绑定
    CLR垃圾回收的设计
    CLR线程概览(下)
    CLR线程概览(一)
    使用sos查看.NET对象内存布局
    .NET对象的内存布局
    MYC编译器源码之代码生成
  • 原文地址:https://www.cnblogs.com/oBYBo/p/13047613.html
Copyright © 2011-2022 走看看