x87 FPU详解(0)

x87 FPU详解(0)

admin 2019年6月1日

8个80位宽的数据寄存器
控制寄存器
状态寄存器
标记字寄存器
最后一条指令指针寄存器
最后的数据指针寄存器
最后一条指令操作码寄存器

不可以在x87 FPU数据寄存和x86-32通用寄存器间直接传输数据,必须通过中间内存操作

专用寄存器:

X rc rc pc pc pm umom zm dm im
位域名称作用描述
im无效操作掩码无效操作异常掩码位 1禁用
dm不合规格操作数掩码不合规格操作数异常掩码 1禁用
zm除零掩码除数为零异常掩码 1禁用
om向上溢出掩码向上溢出异常掩码 1禁用
um向下溢出掩码向下溢出异常掩码 1禁用
pm精度掩码精度异常掩码 1禁用
pc精度控制域指定基本浮点运算精度,有效选项包括单精度00b,双精度10b,以及扩展精度11b
rc舍入控制位域指定对x87fpu计算结果舍入方式。有效选项包括就近舍入00b,朝负无穷舍入01b,朝正无穷舍入10b,0舍入或截断
x无穷大控制位允许处理无穷大值是为了兼容80287数学协处理器,现在的应用软件可以忽略此标志

状态寄存器:

bc3tostostosc2c1c0essfpeueoezedeie
位域名称作用描述
ie无效操作异常无效操作异常的状态位;指令使用了无效操作数时置1
de不合规格操作数异常 不合规格操作数异常的状态位;指令使用了非正常操作数置1
ze除0异常除0异常的状态位;除0置1
oe向上溢出异常向上溢出异常的状态位;运算结果超过目标操作数允许最大值置1
ue向下溢出异常向下溢出异常的状态位;如果运算结果小于目标操作数允许的最小值时置1
pe精度异常精度异常的状态位;如果运算结果不能用二进制数精确表示目标操作数的格式时置1
sf栈错误值为1表示发生栈错误无效操作异常也置1;条件码位C1
表明栈错误的类型:向下溢出=0,向上=1
es错误摘要状态表明至少设置了一个没有解除掩码的异常
c0条件码标志0x87 fpu状态标志
c1 条件码标志 1 x87 fpu状态标志
c2 条件码标志2 x87 fpu状态标志
tos栈顶寄存器三个位用来组合表明当前栈顶寄存器
c3 条件码标志 3 x87 fpu状态标志
b忙标志es标志的副本,为了兼容8087;现在软件可以忽略此标志

这些标志位无法自动清除,需手动使用fclex或者fnclex

没有办法直接测试x87FPU状态寄存器,必须使用fstsw或者fnstw指令将其复制到内存或者寄存器ax中

发表评论

电子邮件地址不会被公开。 必填项已用*标注