浮点运算

浮点数格式

格式 符号 指数 有效数 总长 指数偏移 精确度(二进制) 精确度(十进制) C++类型
单精度 1 8 23 32 127 24 ~7 float
双精度 1 11 52 64 1023 53 ~16 double
扩展双精度 1 15 64 80 16383 64 ~19 long double
四倍精度 1 15 112 128 16383 113 ~34 long double, __float128, _Quad

浮点数特殊值

特殊值 十进制 单精度 双精度 扩展双精度
+0 0.0 0000 0000 00000000 00000000 00000000 00000000 00000000 00000000
-0 -0.0 8000 0000 80000000 00000000 80000000 00000000 00000000 00000000
+∞ Inf 7F80 0000 7FF00000 00000000 7FFF0000 00000000 00000000 00000000
-∞ -Inf FF80 0000 FFF00000 00000000 FFFF0000 00000000 00000000 00000000
NaN NaN ___0 0000 ____0000 00000000 _____000 00000000 00000000 00000000

数据类型对应

X87 FPU NASM MASM GAS lenght
Single precision DD REAL4 .float .single 32
Double precision DQ REAL8 .double 64
Double extended DT REAL10 .tfloat 80
Word integer DW WORD .word 16
Doubleword integer DD DWORD .long .int 32
Quadword integer DQ QWORD .quad 64
Packed BCD integer DT TBYTE 不支持 80

X87 寄存器

80 位寄存器

保存浮点数。0 ~ 63 位:有效数。64 ~ 78 位:指数。79 位:符号。

  • R7
  • R6
  • R5
  • R4
  • R3
  • R2
  • R1
  • R0

其他寄存器

48 位寄存器。0 ~ 31 位:偏移量。32 - 47 位:段选择器。

  • 48 位 Last Instruction Pointer: 指向最后指令的地址
  • 48 位 Last Data/Operand Pointer: 指向最后数据的地址
  • 16 位 Status Register: 状态寄存器
  • 16 位 Control Register: 控制寄存器
  • 16 位 Tag Register: 标志寄存器
  • 11 位 Opcode Register: 操作码寄存器

状态寄存器

0 1 2 3 4 5 6 7 8 9 10 11 ~ 13 14 15
I D Z O U P 栈错误 错误请求/中断请求 状况0 状况1 状况2 栈顶 状况3 忙碌
  • I:invalid operation 无效操作
  • D:denormalized operand 非正规操作数
  • Z:zero divide 除 0
  • O:overflow 向上溢出
  • U:underflow 向下溢出
  • P:precision 精度受损
  • 栈错误:溢出,试图将数据加载入已具备有效值的寄存器中或试图从不含有效数字的寄存器里获取数据。
  • 状况:浮点算术结果

控制寄存器

0 1 2 3 4 5 6、7 8、9 10、11 12 13 ~ 15
IM DM ZM OM UM PM 保留 精度控制 舍入控制 无穷控制 保留

掩码异常置为 1,异常交由 FPU 处理,清除为 0,异常时产生中断。

  • IM:invalid operation 无效操作
  • DM:denormalized operand 非正规操作数
  • ZM:zero divide 除 0
  • OM:overflow 向上溢出
  • UM:underflow 向下溢出
  • PM:precision 精度受损
  • 精度控制
    • 00:单精度
    • 01:保留
    • 10:双精度
    • 11:扩展双精度

标志寄存器

每 2 位与 R 寄存器对应的标志。

  • 00:该 R 寄存器内是有效非零值。
  • 01:该 R 寄存器内是 0 或等价于 0 的值。
  • 10:该 R 寄存器内是 NaN、inf、-inf 或非正规数等特殊值。
  • 11:该 R 寄存器为空。(FINIT 与 弹出指令会置空)

操作码寄存器

保存最近执行的非控制指令的第一字节低 3 位(FPU 操作指令首字节高 5 位相同)和指令的第二个字节。

SSE MXCSR 寄存器

  • 0 ~ 5:异常标志
    • 0:IE 无效操作
    • 1:DE 非正规操作数
    • 2:ZE 除以 0
    • 3:OE 上溢
    • 4:UE 下溢
    • 5:PE 精度受损
  • 6:denormalized operands are zero,置 1 表示非正规操作数会在保留符号的前提下转换为零。(不兼容 IEEE 754)
  • 7 ~ 12:异常掩码
  • 13、14:舍入控制
  • 15:flush to zero,将下溢调整为 0。(不兼容 IEEE 754)
分享