浮点数格式
格式 | 符号 | 指数 | 有效数 | 总长 | 指数偏移 | 精确度(二进制) | 精确度(十进制) | 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)