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寄存器
- 累加器(Accumulator)寄存器(ST0 - ST7):它们是x87寄存器集合中的核心部分。每个寄存器都可以容纳80位(10字节)的扩展精度浮点数。
- 控制寄存器(Control Register)(CW):用于控制浮点运算的各种设置,例如舍入模式、精度控制等。
- 状态寄存器(Status Register)(SW):记录浮点操作的一些状态信息,例如运算结果的状态、出现的异常等。
- 标记寄存器(Tag Register)(TW):用于存储每个浮点寄存器的标记位,标记对应寄存器是否包含有效的浮点数。
x87常用指令
x87指令集使用了一个称为FPU(Floating-Point Unit)的数学协处理器,它独立于CPU,并用于执行浮点运算。下面是一些常见的x87指令集的操作:
- 加载和存储指令:
FLD
: 从内存加载一个浮点数到FPU寄存器栈顶。FST
: 将FPU栈顶的浮点数存储到内存中。FLDENV
和FSTENV
: 加载和保存FPU环境,包括控制寄存器和状态寄存器等。
- 算术指令:
FADD
: 将栈顶的两个浮点数相加,并将结果存储在栈顶。FSUB
: 从栈顶的浮点数中减去下一个浮点数,并将结果存储在栈顶。FMUL
: 将栈顶的两个浮点数相乘,并将结果存储在栈顶。FDIV
: 用栈顶的浮点数除以下一个浮点数,并将结果存储在栈顶。
- 转换指令:
FIST
: 将FPU栈顶的浮点数转换为整数,并存储在内存中。FISTP
: 和**FIST
**类似,但在转换后将结果弹出栈。
- 控制指令:
FCOM
: 比较栈顶的两个浮点数,并设置状态寄存器中的标志。FUCOM
: 类似于**FCOM
**,但处理未规范的操作数(NaN)。FCOMI
: 执行浮点数比较,并将结果写入EFLAGS寄存器中。FUCOMI
: 类似于**FCOMI
**,但处理未规范的操作数(NaN)。
x87部分指令演示
x87指令集是用于处理浮点数运算的指令集,它提供了一组用于执行浮点操作的指令。x87指令集在现代x86处理器中仍然存在,但由于SSE(Streaming SIMD Extensions)和AVX(Advanced Vector Extensions)等更现代的指令集的引入,使用x87指令集的情况相对较少。在这里,我将详细介绍x87指令集中常见的指令以及它们的用途,并为每个指令提供一个简单的示例。
FLD - Load Floating-Point Value: 从内存中加载一个浮点数值到x87 FPU栈顶。
1
2
3
fld dword [float_value]FST - Store Floating-Point Value: 将x87 FPU栈顶的浮点数值存储到内存中。
1
2
3
fst dword [result]FADD - Add: 将栈顶的两个浮点数值相加,并将结果存储在栈顶。
1
2
3
faddFSUB - Subtract: 从栈顶的浮点数中减去下一个浮点数,并将结果存储在栈顶。
1
2
3
fsubFMUL - Multiply: 将栈顶的两个浮点数值相乘,并将结果存储在栈顶。
1
2
3
fmulFDIV - Divide: 用栈顶的浮点数除以下一个浮点数,并将结果存储在栈顶。
1
2
3
fdivFIST - Store Integer after FPU Comparison: 将FPU栈顶的浮点数转换为整数,并存储在内存中。
1
2
3
fist dword [integer_value]FISTP - Store Integer and Pop: 和FIST类似,但在转换后将结果弹出栈。
1
2
3
fistp dword [integer_value]FCOM - Compare Floating-Point Values: 比较栈顶的两个浮点数,并设置状态寄存器中的标志。
1
2
3
fcomFUCOM - Unordered Compare Floating-Point Values: 类似于FCOM,但处理未规范的操作数(NaN)。
1
2
3
fucom