X87 FPU 指令集
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 指令集相关推荐
- Intel x87 FPU的使用基础
Intel x87 FPU专门用于执行标量浮点计算,可以对单精度浮点(32位).双精度浮点(64位)以及扩展双精度浮点(80位)进行计算,并顺从IEEE754标准. x87 FPU可以工作在32位兼容 ...
- GPU指令集技术分析
GPU指令集技术分析 本文将两篇文章整理了一下. 参考文章链接如下: https://zhuanlan.zhihu.com/p/391238629 https://zhuanlan.zhihu.com ...
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令
FXSAVE and FXRSTOR instructions FXSAVE与FXRSTOR指令是从Pentium II处理器引入到IA-32架构上的,早于SSE指令集的引入.这两条指令的最初版本是用 ...
- [VC] 检测AVX系列指令集的支持级别(AVX、AVX2、F16C、FMA、FMA4、XOP)
从2011年的Sandy Bridge微架构处理器开始,现在支持AVX系列指令集的处理器越来越多了.本文探讨如何用VC编写检测AVX系列指令集的程序,并利用了先前的CPUIDFIELD方案. 一.AV ...
- 【Intel汇编指令集】寄存器
目录 1.通用寄存器 2.段寄存器 3.标志寄存器 4.指令指针寄存器 5.浮点寄存器 6.MMX寄存器. 7.XMM寄存器 8.YMM寄存器 9.ZMM寄存器 指令集手册下载:Intel® 64 a ...
- x86-SSE指令集
SSE 指令集 (1)SSE 标量浮点数据传输指令 movss movsd 在俩个xmm指令金阊区之间或者内存位置和xmm寄存器之间复制标量浮点数 (2)SSE 标量浮点算术运算指令 addss ad ...
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解
MXCSR Control and Status Register 32位宽的MXCSR寄存器(参看下图)包含了控制与状态标志位,适用于SSE,SSE2和SSE3 SIMD浮点操作.这些标志位包括: ...
- 汇编程序设计与计算机体系结构软件工程师教程笔记:函数、字符串、浮点运算
<汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...
- 慕课《深入理解计算机系统》袁林枫老师章节测试1-9
1以下有关冯.诺依曼结构思想的叙述中,错误的是( C ). A.计算机内部以二进制形式表示指令和数据 B.程序由指令构成,计算机能自动执行程序中一条一条指令 C.指令和数据都放在存储器中,两者在形式上 ...
最新文章
- 创意DIY项目分享(3)
- python3华丽gui_Python3.7 - tkinter Gui 03 Options的用法
- Spark架构与作业执行流程简介
- 嵌入式开发-lesson9-顺序结构程序设计
- Scrapy-redis 源码分析 及 框架使用
- ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点(python版本)
- Python 持久存储
- stm32f4 自旋锁_STM32L0系列控制器低功耗模式详解
- Android 反编译代码,资源修改,重新签名
- vue 引入第三方文件(高拍仪),传值及接口调用。
- 史上最全:Mac搭建Airtest IDE +IOS 测试环境
- 美团外卖【成都】技术团队,招人啦!
- 计算机文档翻页怎么设置,PDF文档翻页设置
- FORTIFY_SOURCE详解
- 计算机窗口是什么意思解释,Windows电脑窗口是什么?关于电脑窗口的一些基础知识...
- 【Prefix-Tuning】Fine-tuning过时啦,NLG生成任务如何Tuning?
- C++ 调用7z进行解压缩,并返回解压缩进度和异常信息
- 【从零开始学极狐gitlab】07作业关键字allow_failure、when、timeout(二) #JIHULAB101
- 个人能力--认知能力
- SpringBoot 生成pdf文件(含报表)