80387浮点指令详解与示例

需积分: 0 2 下载量 201 浏览量 更新于2024-07-27 收藏 199KB DOC 举报
"这篇文章是个人整理的关于80387浮点指令的汇编语言教程,主要基于《保护方式下的80386及其编程》3.7.6节内容,适用于MASM6.15和CodeView 4.10软件环境。由于编译器差异,部分指令的实际执行效果可能与书中的描述存在不一致。文章提供了一些浮点数的十六进制表示,并通过实例展示了F2XM1、FABS和FADD等浮点运算指令的用法和限制。" 80387浮点指令是Intel 80387数学协处理器所支持的用于处理浮点数运算的指令集。这些指令在汇编语言编程中尤其重要,因为它们能高效地执行复杂的浮点运算,对于科学计算和图形处理等领域至关重要。 1. **F2XM1** 指令:该指令将栈顶的浮点数(ST)乘以2并减去1,结果仍存储在ST中。但有一个限制,即原始ST值必须在[-0.5, 0.5]范围内。如果ST值超出这个范围,指令不会执行任何操作。示例中展示了当输入值为正数和负数时,F2XM1指令的结果。 2. **FABS** 指令:这个指令用于计算栈顶浮点数的绝对值,将结果存储回ST中。示例中通过比较正负数的处理,解释了FABS如何将负数转换为其正绝对值。 3. **FADD** 指令:FADD用于将栈顶的两个浮点数相加,结果存入ST(1),然后弹出栈顶的原始值ST。示例演示了两个浮点数的加法操作,并展示了结果如何存储到内存变量中。 这些指令是80387浮点运算的基础,其他类似的指令还包括FSUB(浮点数减法),FMUL(浮点数乘法),FDIV(浮点数除法),以及一系列用于比较、转换和控制流的指令。理解这些指令的用法和限制对于编写涉及浮点运算的汇编代码至关重要。 80387浮点指令集的使用通常需要配合特定的编译器和汇编器,例如MASM6.15和CodeView 4.10,不同编译器可能会对指令的实现和行为有所差异。因此,在编写代码时,开发者需要了解所使用的工具链的行为,以确保代码的正确性和兼容性。 最后,作者提供了一些浮点数的十六进制表示,这对于理解浮点数在内存中的存储方式和浮点运算过程中的变化非常有帮助。这些数值包括负数、正数、小数以及一些特殊值(如π/3和平方根等)。通过这些数值,可以直观地观察浮点运算指令对浮点数的影响。