FPU 指令集
(1) FPU 数据传输指令集
fld 将浮点值压入寄存器栈,源操作数可以是ST(i)或内存地址
fild 从内存中读取一个有符号整型操作数,将该值转换为扩展双精度值,并将此结果加载到寄存器栈中
fbld 从内存中读取压缩BCD操作数,将该值转换为一个扩展双精度值,并将结果加载到推栈
fst 拷贝ST(0)到ST(i)或内存位置
fstp 执行与fst同样的操作,并且进行弹栈操作
fist 将ST(0)中的值转换为一个整型数,并将结果保存到指定的内存的位置
fistp 执行与fist同样的操作,并且进行弹栈操作
fisttp 利用截断ST(0)中的值转换为整型数,把结果保存到指定的内存位置,同时弹出推栈本指令在支持SSE3的处理器中才有效
fbstp 将ST(0)中的值转换为组合BCD格式,保存结果到指定的存储位置,并弹出推栈
fxch 交换寄存器ST(O)和ST(i)的内容
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
fcmovcc 如果指定条件为真,则有条件地将ST(i)的内容复制到ST(0)。
fcmovcc 指令的条件码
B 小于 (CF==1)
NB 不小于 (CF==0)
E 等于(ZF==1)
NE 不等于(ZF==0)
BE 小于或等于(CF==1 or ZF ==1)
NBE 不小于或等于(CF=0 and ZF==0)
U 无序的(PF==1)
NU 有序的(PF==0)
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2)FPU 基本运算指令集
fadd 源操作数和目标操作数相加源操作数可以是内存地址或者FPU寄存器,目标操作数必须是FPU寄存器
faddp ST(i)和ST(0)相加,计算结果存入ST(0)中
fsub 从目标操作数(被减数)中减去的源操作数(减数),结果存入目标操作数,源操作数可以是内存地址或者FPU寄存器,目标操作数必须是FPU寄存器
fiadd ST(0)与指定的整型操作数相加,并把结果存入ST(0)
fsubr 从源操作数(被减数)中减去的目标操作数(减数),结果存入目标操作数,源操作数可以是内存地址或者FPU寄存器,目标操作数必须是FPU寄存器
fsubp 从ST(i)中减去ST(0),保存差值到ST(i),弹出推栈
fsubrp 从ST(0)中减去ST(i),保存差值到ST(i),弹出推栈
fisub 从ST(0)中减去指定的整型数操作数,保存差值到ST(0)
fisubr 从指定的整型操作数中减去ST(0),保存差值到ST(0)
fmul 源操作数和目标操作数相乘,乘积存入目标操作数,源操作数可以是内存地址或者FPU寄存器,目标操作数必须是FPU寄存器
fmulp ST(i)和ST(0)相乘,乘积存入ST(i)中,并弹出推栈
fimul ST(0)与指定的整型操作数相乘,乘积存入ST(0)中
fdiv 目标操作数(被除数)除以源操作数(除数)。源操作数可以是内存地址或者FPU寄存器,目标操作数必须是FPU寄存器
fdivr 源操作数(被除数)除以目标操作数(除数)。源操作数可以是内存地址或者FPU寄存器,目标操作数必须是FPU寄存器
fdivp ST(i)除以ST(0),商保存到ST(i)中,并弹出推栈
fdivrp ST(0)除以ST(i),商保存到ST(i)中,并弹出推栈
fidiv ST(0)除以指定的整型操作数,商保存ST(0)中
fidivr 用指定的整型操作数除以ST(0),商保存到ST(0)中
fprem 计算ST(0)除以ST(1),得到的余数存入ST(0)。这条指令常用在计算余数的循环中
fpreml 类似 fprem 指令 不过计算余数的时候用的是IEEE754 标准指定的算法
fabs 计算ST(0)的绝对值,并将结果存入ST(0)中
fchs 补充ST(0)的符号位,并将结果保存到ST(0)
frndint 对ST(0)中的值舍入到最近的整型数,将结果存入ST(0)中,使用FPU控制字中的RC位域来指定舍入的方式
fsqrt 计算ST(0)的平方根,结果存入ST(0)
fxtract 分离ST(0)的指数部分和有效数部分,执行完指令后,ST(0)中包含有效数,ST(1)中包含指数
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(3)FPU 数据比较指令
fcom 比较ST(0)与ST(i),或者比较ST(0)与内存操作数,同时基于比较结果设置FPU条件码标志
fcomp和(fcompp) 比较ST(0)与ST(i),或者比较ST(0)与内存操作数,设置FPU条件码标志,同时弹出推栈 。 (fcompp 指令进行俩次弹栈)
fucom 执行ST(0)和ST(i)的无序比较操作,根据结果设置FPU条件码标志
fucomp和(fucompp) 执行ST(0)与ST(i)的无序比较操作,设置FPU条件码标志,并弹出推栈(fucompp 弹栈俩次)
ficom 比较ST(0)与内存中的整型操作数,根据FPU条件码标志
ficomp 比较ST(0)与内存中的整型操作数,设置FPU条件码标志,同时弹出推栈
fcomi 比较ST(0)与ST(i),同时根据结果直接设置EFLAGS.CF,EFLAGS.PF和EFLAGS.ZF
fcomip 执行与fcomi指令同样操作,同时弹出推栈
fucomi 执行ST(0)与ST(i)的无序比较操作,同时根据结果直接设置EFLAGS.CF,EFLAGS.PF和EFLAGS.ZF
fucomip 执行与fucomi指令同样的操作,同时弹出推栈
ftst 比较ST(0)与0.0,根据结果设置FPU条件码标志
fxam 检查ST(0)并设置FPU条件码标志,表明值所属的类,可能的类非规范数,空状态,无穷大,NaN,正常有限数,不支持的格式和0
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(4)FPU 超越函数指令集
fsin 计算ST(0)的正弦值并将结果存入ST(0)中
fcos 计算ST(0)的余弦值并将结果存入ST(0)中
fsincos 计算ST(0)的正弦值和余弦值,执行完指令后,ST(0)和ST(1)中分别包含源操作数的正弦和余弦值
fptan 计算ST(0)的正切值并将结果存入ST(0)中,同时将常数1.0压入推栈
fpatan 计算ST(0)除以ST(0)的反正切值,同时将结果存入ST(0)中
f2xm1 计算2^(ST(0)-1)同时把结果存入ST(0),源操作数的值必须在-1.0 到+1.0之间
fy12x 计算ST(1)*log2(ST(0)),结果存入ST(1),并弹出推栈
fy12xp1 计算ST(1)*log2(ST(0)+1.0),结果存入ST(1),并弹出推栈
fscale 截断(向0舍入)ST(1)的值,并将此值与ST(0)的指数部分相加,这指令用来对2的整数幂做快速乘除计算
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(5)FPU 常量指令集
fld1 把常数+1.0压入FPU寄存器栈
fldz 把常数+0.0压入FPU寄存器栈
fldpi 把常数 π 压入FPU寄存器栈
fldl2e 把常数值log2(e)压入FPU寄存器栈
fldln2 把常数值ln(2)压入FPU寄存器栈
fld2t 把常数log2(10)压入FPU寄存器栈
fldlg2 把常数log10(2)压入FPU寄存器栈
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(6)FPU 控制指令集
finit和 (fninit) 初始化FPU至缺省状态
fincstp 通过对FPU状态字中的TOS域加1,更改当前的推栈指针位置,FPU数据寄存器和标记字的内容不被修改,也就是说,改指令不等用于入栈,此指令可用于手动管理FPU寄存器栈
fdecstp 通过对FPU状态字中的TOS域减1,更改当前的推栈指针位置,FPU数据寄存器和标记字的内容不被修改,也就是说,改指令不等用于入栈,此指令可用于手动管理FPU寄存器栈
ffree 通过设置相应的标记字状态为空,释放FPU浮点寄存器
flcdw 从指定的内存位置加载FPU控制字
fstcw 和(fmstcw) 把FPU控制字保存到指定的内存位置
fstsw和(fnstsw) 把FPU状态字保存到AX寄存器或者内存位置
fclex和(fnclex) 清除以下FPU状态字位:PE,UE,OE,ZE,DE,IE,ES,SF和B。执行完此指令后,条件码标志C0,C1,C2和C3处于未定义状态
fstenv和(fnstenv) 把当前FPU执行环境保存到内存,包括控制字,状态字,标记字,FPU数据指针,FPU指令指针和FPU最后一条指令操作码
fldenv 从内存中加载FPU执行环境
fsave和(fnasve) 保存当前FPU运行状态,包括所有数据寄存器的内容和以下项:控制字,状态字,标记字,FPU数据指针,FPU指令指针和FPU最后一条指令操作数码
frstor 从内存中加载FPU的运行状态
- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
FPU CMOV移动指令
fcmovb 如果st(0)小于st(x),则进行传送
fcmove 如果st(0)等于st(x),则进行传送
fcmovbe 如果st(0)小于或等于st(x),则进行传送
fcmovu 如果st(0)无序,则进行传送
fcmovnb 如果st(0)不小于st(x),则进行传送
fcmovne 如果st(0)不等于st(x),则进行传送
fcmovnbe 如果st(0)不小于或等于st(x),则进行传送
fcmovnu 如果st(0)非无序,则进行传送

X87 FPU 指令集相关推荐

  1. Intel x87 FPU的使用基础

    Intel x87 FPU专门用于执行标量浮点计算,可以对单精度浮点(32位).双精度浮点(64位)以及扩展双精度浮点(80位)进行计算,并顺从IEEE754标准. x87 FPU可以工作在32位兼容 ...

  2. GPU指令集技术分析

    GPU指令集技术分析 本文将两篇文章整理了一下. 参考文章链接如下: https://zhuanlan.zhihu.com/p/391238629 https://zhuanlan.zhihu.com ...

  3. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令

    FXSAVE and FXRSTOR instructions FXSAVE与FXRSTOR指令是从Pentium II处理器引入到IA-32架构上的,早于SSE指令集的引入.这两条指令的最初版本是用 ...

  4. [VC] 检测AVX系列指令集的支持级别(AVX、AVX2、F16C、FMA、FMA4、XOP)

    从2011年的Sandy Bridge微架构处理器开始,现在支持AVX系列指令集的处理器越来越多了.本文探讨如何用VC编写检测AVX系列指令集的程序,并利用了先前的CPUIDFIELD方案. 一.AV ...

  5. 【Intel汇编指令集】寄存器

    目录 1.通用寄存器 2.段寄存器 3.标志寄存器 4.指令指针寄存器 5.浮点寄存器 6.MMX寄存器. 7.XMM寄存器 8.YMM寄存器 9.ZMM寄存器 指令集手册下载:Intel® 64 a ...

  6. x86-SSE指令集

    SSE 指令集 (1)SSE 标量浮点数据传输指令 movss movsd 在俩个xmm指令金阊区之间或者内存位置和xmm寄存器之间复制标量浮点数 (2)SSE 标量浮点算术运算指令 addss ad ...

  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

    MXCSR Control and Status Register 32位宽的MXCSR寄存器(参看下图)包含了控制与状态标志位,适用于SSE,SSE2和SSE3 SIMD浮点操作.这些标志位包括: ...

  8. 汇编程序设计与计算机体系结构软件工程师教程笔记:函数、字符串、浮点运算

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  9. 慕课《深入理解计算机系统》袁林枫老师章节测试1-9

    1以下有关冯.诺依曼结构思想的叙述中,错误的是( C ). A.计算机内部以二进制形式表示指令和数据 B.程序由指令构成,计算机能自动执行程序中一条一条指令 C.指令和数据都放在存储器中,两者在形式上 ...

最新文章

  1. 创意DIY项目分享(3)
  2. python3华丽gui_Python3.7 - tkinter Gui 03 Options的用法
  3. Spark架构与作业执行流程简介
  4. 嵌入式开发-lesson9-顺序结构程序设计
  5. Scrapy-redis 源码分析 及 框架使用
  6. ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点(python版本)
  7. Python 持久存储
  8. stm32f4 自旋锁_STM32L0系列控制器低功耗模式详解
  9. Android 反编译代码,资源修改,重新签名
  10. vue 引入第三方文件(高拍仪),传值及接口调用。
  11. 史上最全:Mac搭建Airtest IDE +IOS 测试环境
  12. 美团外卖【成都】技术团队,招人啦!
  13. 计算机文档翻页怎么设置,PDF文档翻页设置
  14. FORTIFY_SOURCE详解
  15. 计算机窗口是什么意思解释,Windows电脑窗口是什么?关于电脑窗口的一些基础知识...
  16. 【Prefix-Tuning】Fine-tuning过时啦,NLG生成任务如何Tuning?
  17. C++ 调用7z进行解压缩,并返回解压缩进度和异常信息
  18. 【从零开始学极狐gitlab】07作业关键字allow_failure、when、timeout(二) #JIHULAB101
  19. 个人能力--认知能力
  20. SpringBoot 生成pdf文件(含报表)

热门文章

  1. setTimeout with a shorter delay
  2. 【ADRC】扩张状态观测器(ESO)
  3. 一篇文章读懂身份技术发展简史
  4. 麦肯锡精英的39个工作习惯
  5. linux 挂载4t移动硬盘,Linux挂载移动硬盘
  6. 什么是AJAX?如何实现AJAX异步请求?
  7. 抖音seo搜索是什么?源码部署-seo排名系统源码分析
  8. c 数组上限_深度文章,高手必看:C编程表驱动法编程实践(精华帖,建议收藏并实践)...
  9. 【LaTex】在 LaTex 中优雅地插入行内和行间代码
  10. C#模拟鼠标操作以及键盘输入