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. R语言ggplot2可视化:ggplot2可视化水平堆叠条形图、并且在每个堆叠条形图的内部居中添加百分比文本标签信息
  2. 解决magento保存产品时耗时很长的问题
  3. 《深入理解C++11:C++ 11新特性解析与应用》——导读
  4. android邮件发送几种方式
  5. CFile、CStdioFile、FILE和其他文件操作(转)
  6. 没用过.gitignore还敢自称高级开发?
  7. jQuery 遍历 each()方法
  8. 分布式跟踪系统:Zipkin
  9. android调节屏幕亮度
  10. 编写爬虫遇到的问题总结
  11. 更改应用程序图标_苹果手机升级iOS14试试自定义应用图标
  12. 都这麽大了还不快了解防病毒网关?
  13. Dorado7 首页菜单CSS调整
  14. Java 后台 google地图通过经纬度寻找地址
  15. 服务端客户端的文件流式传输
  16. 数据结构与算法_01链表
  17. mysql的sid_修改数据库的SID
  18. html表单颜色背景图片大全,css背景颜色、背景图片,以及列表的多种样式
  19. linux cp 性能,linux性能监控以及优化之CPU
  20. 时序分解股票数据并部署在微信公众号上

热门文章

  1. (目标检测)①数据集的建立(拍摄收集、数据集标注)
  2. 十大低代码开发平台排行榜,低代码开发平台哪个好用?
  3. 如何从一名“普通码农”成长为技术Leader?
  4. oracle中 ''dual'' 的含义
  5. STM8S105S4T6C和STM8S105C6T6对比
  6. 深圳大学计算机专业性别比例,深圳大学
  7. 【爬虫】每天定时爬取网页小故事并发送至指定邮箱
  8. Parameters: { “silent“ } might not be used. This may not be accurate due to some parameters are
  9. 利用openssl 库制作证书以及验证
  10. ES6看这一篇就够了