X87浮点指令

二木 王者

X87浮点指令

87 FPU寄存器栈有一定数量的寄存器(通常是8个或更多,取决于处理器)

x87简介

x87指令集是用于处理浮点数运算的指令集,它是Intel 8087数学协处理器的指令集的扩展,后来成为x86处理器家族的一部分。x87指令集为浮点运算提供了硬件支持,包括浮点加减、乘除、取整等操作。在较新的x86处理器中,x87指令集被SSE(Streaming SIMD Extensions)和AVX(Advanced Vector Extensions)等更先进的浮点指令集所取代,但x87仍然兼容并在一些特定情况下使用。

x87指令集的指令主要针对浮点数运算,它提供了高精度的浮点计算能力。但由于SSE和AVX指令集的引入,现代的x86处理器更倾向于使用这些更高级的指令集,因为它们可以处理更多的数据和并行操作。

x87寄存器

  1. 累加器(Accumulator)寄存器(ST0 - ST7):它们是x87寄存器集合中的核心部分。每个寄存器都可以容纳80位(10字节)的扩展精度浮点数。
  2. 控制寄存器(Control Register)(CW):用于控制浮点运算的各种设置,例如舍入模式、精度控制等。
  3. 状态寄存器(Status Register)(SW):记录浮点操作的一些状态信息,例如运算结果的状态、出现的异常等。
  4. 标记寄存器(Tag Register)(TW):用于存储每个浮点寄存器的标记位,标记对应寄存器是否包含有效的浮点数。

x87常用指令

x87指令集使用了一个称为FPU(Floating-Point Unit)的数学协处理器,它独立于CPU,并用于执行浮点运算。下面是一些常见的x87指令集的操作:

  1. 加载和存储指令:
    • FLD: 从内存加载一个浮点数到FPU寄存器栈顶。
    • FST: 将FPU栈顶的浮点数存储到内存中。
    • FLDENV 和 FSTENV: 加载和保存FPU环境,包括控制寄存器和状态寄存器等。
  2. 算术指令:
    • FADD: 将栈顶的两个浮点数相加,并将结果存储在栈顶。
    • FSUB: 从栈顶的浮点数中减去下一个浮点数,并将结果存储在栈顶。
    • FMUL: 将栈顶的两个浮点数相乘,并将结果存储在栈顶。
    • FDIV: 用栈顶的浮点数除以下一个浮点数,并将结果存储在栈顶。
  3. 转换指令:
    • FIST: 将FPU栈顶的浮点数转换为整数,并存储在内存中。
    • FISTP: 和**FIST**类似,但在转换后将结果弹出栈。
  4. 控制指令:
    • FCOM: 比较栈顶的两个浮点数,并设置状态寄存器中的标志。
    • FUCOM: 类似于**FCOM**,但处理未规范的操作数(NaN)。
    • FCOMI: 执行浮点数比较,并将结果写入EFLAGS寄存器中。
    • FUCOMI: 类似于**FCOMI**,但处理未规范的操作数(NaN)。

x87部分指令演示

x87指令集是用于处理浮点数运算的指令集,它提供了一组用于执行浮点操作的指令。x87指令集在现代x86处理器中仍然存在,但由于SSE(Streaming SIMD Extensions)和AVX(Advanced Vector Extensions)等更现代的指令集的引入,使用x87指令集的情况相对较少。在这里,我将详细介绍x87指令集中常见的指令以及它们的用途,并为每个指令提供一个简单的示例。

  1. FLD - Load Floating-Point Value: 从内存中加载一个浮点数值到x87 FPU栈顶。

    1
    2
    3

    fld dword [float_value]

  2. FST - Store Floating-Point Value: 将x87 FPU栈顶的浮点数值存储到内存中。

    1
    2
    3

    fst dword [result]

  3. FADD - Add: 将栈顶的两个浮点数值相加,并将结果存储在栈顶。

    1
    2
    3

    fadd

  4. FSUB - Subtract: 从栈顶的浮点数中减去下一个浮点数,并将结果存储在栈顶。

    1
    2
    3

    fsub

  5. FMUL - Multiply: 将栈顶的两个浮点数值相乘,并将结果存储在栈顶。

    1
    2
    3

    fmul

  6. FDIV - Divide: 用栈顶的浮点数除以下一个浮点数,并将结果存储在栈顶。

    1
    2
    3

    fdiv

  7. FIST - Store Integer after FPU Comparison: 将FPU栈顶的浮点数转换为整数,并存储在内存中。

    1
    2
    3

    fist dword [integer_value]

  8. FISTP - Store Integer and Pop: 和FIST类似,但在转换后将结果弹出栈。

    1
    2
    3

    fistp dword [integer_value]

  9. FCOM - Compare Floating-Point Values: 比较栈顶的两个浮点数,并设置状态寄存器中的标志。

    1
    2
    3

    fcom

  10. FUCOM - Unordered Compare Floating-Point Values: 类似于FCOM,但处理未规范的操作数(NaN)。

    1
    2
    3

    fucom

 评论