汇编速查-FPU

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_第1张图片

状态寄存器和控制寄存器

FPU独立于主处理器,所以一般不使用EFLAGS寄存器表示结果和确定行为。FPU有自己的寄存器组织,状态寄存器、控制寄存器和标记寄存器用于存取FPU的特性和确定FPU的状态
汇编速查-FPU_第2张图片

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

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

2. 控制寄存器

汇编速查-FPU_第4张图片
前6个控制使用状态寄存器中的那些异常标志位,某位置1时屏蔽该异常,默认屏蔽6个异常
精度控制
00 单精度24bit有效位
01 未使用
10 双精度53bit有效位
11 扩展双精度64bit有效位 FPU默认为扩展双精度

舍入控制

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

标记寄存器

16bit每个寄存器2bit,标识这8个80bit的FPU数据寄存器
汇编速查-FPU_第5张图片
00 包含一个合法的扩展双精度值
01 包含零值
10 特殊的浮点值
11 无内容

基本数学运算

汇编速查-FPU_第6张图片

每个指令可以有6个功能:e.g.
汇编速查-FPU_第7张图片

汇编速查-FPU_第8张图片

高级浮点运算

汇编速查-FPU_第9张图片

浮点条件分支

汇编速查-FPU_第10张图片
汇编速查-FPU_第11张图片
汇编速查-FPU_第12张图片

保存和恢复FPU状态

汇编速查-FPU_第13张图片
汇编速查-FPU_第14张图片
这些值存储在一个28字节的内存块中,FLDENV指令用于把内存块加载回FPU环境中。

数据寄存器

这里写图片描述

等待和非等待指令

汇编速查-FPU_第15张图片

优化浮点运算

汇编速查-FPU_第16张图片
汇编速查-FPU_第17张图片

汇编速查-FPU_第18张图片

你可能感兴趣的:(汇编速查)