汇编速查-FPU

来源:互联网 发布:淘宝装修设计师模块 编辑:程序博客网 时间:2024/06/07 11:43

x87 FPU的寄存器

寄存器 说明 数据寄存器 用于浮点数据的8个80bit寄存器 状态寄存器 报告FPU状态的16bit寄存器 控制寄存器 控制FPU精度的16bit寄存器 标记寄存器 描述8个数据寄存器内容的16bit寄存器 FIP寄存器 指向下一条FPU指令的48bitFPU指令指针 FDP寄存器 指向内存中的数据的48bit的FPU数据指针 操作码寄存器 保存FPU处理的最后指令的11bit寄存器

浮点值传入FPU寄存器栈顶

fld source
fild把整数传入FPU寄存器
ffbld把bcd数据传入FPU寄存器
source可以是32bit/64bit/80bit内存位置
.float创建单精度浮点值 flds float_val
.double创建双精度浮点值 fldl double_val

FPU寄存器栈顶值放到内存位置

fsts/fstl des
fstp指令吧FPU寄存器st0的值复制到内存位置,并将值从堆栈中弹出
使用预置的浮点值
这里写图片描述

状态寄存器和控制寄存器

FPU独立于主处理器,所以一般不使用EFLAGS寄存器表示结果和确定行为。FPU有自己的寄存器组织,状态寄存器、控制寄存器和标记寄存器用于存取FPU的特性和确定FPU的状态
这里写图片描述

1. 状态寄存器 表名FPU的操作情况

这里写图片描述
前6位是异常标志。处理过程中发生浮点异常时设置它们。FPU保持他们的状态知道程序运行时清楚他们。
8个寄存器中的任何一个都可以被指派为堆栈的顶端。
FSTSW把状态寄存器读到一个双字的内存位置或者AX寄存器中

2. 控制寄存器

这里写图片描述
前6个控制使用状态寄存器中的那些异常标志位,某位置1时屏蔽该异常,默认屏蔽6个异常
精度控制
00 单精度24bit有效位
01 未使用
10 双精度53bit有效位
11 扩展双精度64bit有效位 FPU默认为扩展双精度

舍入控制

00 舍入到最近值
01 向下舍入-向负无穷
10 向上舍入-向正无穷
11 向0舍入 默认为舍入到最近值
FSTCW把控制寄存器读到一个双字的内存位置
FLDCW指令吧双字内存值加载到控制寄存器中

标记寄存器

16bit每个寄存器2bit,标识这8个80bit的FPU数据寄存器
这里写图片描述
00 包含一个合法的扩展双精度值
01 包含零值
10 特殊的浮点值
11 无内容

基本数学运算

这里写图片描述

每个指令可以有6个功能:e.g.
这里写图片描述

这里写图片描述

高级浮点运算

这里写图片描述

浮点条件分支

这里写图片描述
这里写图片描述
这里写图片描述

保存和恢复FPU状态

这里写图片描述
这里写图片描述
这些值存储在一个28字节的内存块中,FLDENV指令用于把内存块加载回FPU环境中。

数据寄存器

这里写图片描述

等待和非等待指令

这里写图片描述

优化浮点运算

这里写图片描述
这里写图片描述

这里写图片描述

1 0
原创粉丝点击