汇编FPU浮点运算
更新时间:2024-07-06 08:11:01 阅读量: 综合文库 文档下载
- 浮点运算单元 fpu推荐度:
- 相关推荐
浮点执行环境的寄存器主要是8个通用数据寄存器和几个专用寄存器,它们是状态寄存器、控制寄存器、标记寄存器等
8个浮点数据寄存器(FPU Data Register),编号FPR0 ~ FPR7。每个浮点寄存器都是80位的,以扩展精度格式存储数据。当其他类型数据压入数据寄存器时,PFU自动转换成扩展精度;相反,数据寄存器的数据取出时,系统也会自动转换成要求的数据类型。 8个浮点数据寄存器组成首尾相接的堆栈,当前栈顶ST(0)指向的FPRx由状态寄存器中TOP字段指明。数据寄存器不采用随机存取,而是按照“后进先出”的堆栈原则工作,并且首尾循环。向数据寄存器传送(Load)数据时就是入栈,堆栈指针TOP先减1,再将数据压入栈顶寄存器;从数据寄存器取出(Store)数据时就是出栈,先将栈顶寄存器数据弹出,再修改堆栈指针使TOP加1。浮点寄存器栈还有首尾循环相连的特点。例如,若当前栈顶TOP=0(即ST(0) = PFR0),那么,入栈操作后就使TOP=7(即使ST(0) = PFR7),数据被压入PFR7。所以,浮点数据寄存器常常被称为浮点数据栈。
为了表明浮点数据寄存器中数据的性质,对应每个FPR寄存器,都有一个2位的标记(Tag)位,这8个标记tag0 ~ tag7组成一个16位的标记寄存器。
在计算机中,实数的浮点格式(Floating-Point Format)所示,分成指数、有效数字和符号位三个部分。
· 符号(Sign)——表示数据的正负,在最高有效位(MSB)。负数的符号位为1,正数的符号为0。
· 指数(Exponent)——也被称为阶码,表示数据以2为底的幂。指数采用偏移码(Biased Exponent)表示,恒为整数。
· 有效数字(Significand)——表示数据的有效数字,反映数据的精度。有效数字一般采用规格化(Normalized)形式,是一个纯小数,所以也被称为尾数(Mantissa)、小数或分数(Fraction)。
80x87支持三种浮点数据类型:单精度、双精度和扩展精度;它们的长度依次为32、64和80位,即4、8和10个字节;它们遵循美国IEEE(电子电气工程师协会)定义的国际标准浮点格式。
· 单精度浮点数(32位短实数)——由1位符号、8位指数、23位有效数组成。 · 双精度浮点数(64位长实数)——由1位符号、11位指数、52位有效数组成。
· 扩展精度浮点数(80位临时实数)——由1位符号、15位指数、64位有效数组成。很多计算机中并没有80位扩展精度这种数据类型,80x87 FPU主要在内部使用它存贮中间结果,以保证最终数值的精度。
浮点处理单元FPU具有自己的指令系统,共有几十种浮点指令,可以分成传送、算术运算、超越函数、比较、FPU控制等类。浮点指令归属于ESC指令,其前5位的操作码都是11011b,它的指令助记符均以F开头。 1. 浮点传送类指令
浮点数据传送指令完成主存与栈顶st(0)、数据寄存器st(i)与栈顶之间的浮点格式数据的传送。浮点数据寄存器是一个首尾相接的堆栈,所以它的数据传送实际上是对堆栈的操作,有些要改变堆栈指针TOP,即修改当前栈顶。 2. 算术运算类指令
这类浮点指令实现浮点数、16/32位整数的加、减、乘、除运算,它们支持的寻址方式相同。这组指令还包括有关算术运算的指令,例如求绝对值、取整等。 3. 超越函数类指令
浮点指令集中包含有进行三角函数、指数和对数运算的指令。 4. 浮点比较类指令
浮点比较指令比较栈顶数据与指定的源操作数,比较结果通过浮点状态寄存器反映。 5. FPU控制类指令
FPU控制类指令用于控制和检测浮点处理单元FPU的状态及操作方式。
采用浮点指令的汇编语言程序格式,与整数指令源程序格式是类似的,但有以下几点需要注意:
· 使用FPU选择伪指令
由于汇编程序MASM默认只识别8086指令,所以要加上.8087 / .287 / .387等伪指令选择汇编浮点指令;有时,还要加上相应的.238/.386等伪指令。 · 定义浮点数据
我们知道,数据定义伪指令dd(dword) / dq(qword) / dt(tbyte)依次说明32/64/80位数据;它们可以用于定义单精度、双精度和扩展精度浮点数。为了区别于整数定义,MASM 6.11建议采用REAL4、REAL8、REAL10定义单、双、扩展精度浮点数,但不能出现纯整数(其实,整数后面补个小数点就可以了)。相应的数据属性依次是dword、qword、tbyte。另外,实常数可以用E表示10的幂。 · 初始化浮点处理单元
每当执行一个新的浮点程序时,第一条指令都应该是初始化FPU的指令finit。该指令清除浮点数据寄存器栈和异常,为程序提供一个“干净”的初始状态。否则,遗留在浮点寄存器栈中的数据可能会产生堆栈溢出。另一方面,浮点指令程序段结束,也最好清空浮点数据寄存器。 浮点传送程序
.model small
.8087 ;识别浮点指令 .stack .data
f32d dd 100.25 ;单精度浮点数:42C88000 h
f64d dq -0.2109375 ;双精度浮点数:BFCB000000000000 h f80d dt 100.25e9 ;扩展精度浮点数:4023BABAECD400000000 h i16d dw 100 ;字整数:0064 h i32d dd -1234 ;短整数:FFFFFB2E h
i64d dq 123456h ;长整数:0000000000123456 h b80d dt 123456h ;BCD码数:00000000000000123456 h ib32 dd ?
bi80 dt ? .code .startup
start1: finit ;初始化FPU
fld f32d ;压入单精度浮点数f32d fld f64d ;压入双精度浮点数f64d fld f80d ;压入扩展精度浮点数f80d fld st(1) ;压入当前st(1),即f64d fild i16d ;压入字整数i16d fild i32d ;压入短整数i32d fild i64d ;压入长整数i64d fbld b80d ;压入BCD码数b80d
start2: fist dword ptr ib32 ;将栈顶(现为b80d)以短整数保存 fxch ;st(0)与st(1)互换,现栈顶为i64d fbstp tbyte ptr bi80 ;将栈顶弹出成BCD码数 start3: .exit 0 end
对下面的指令先做一些说明:
st(i):代表浮点寄存器,所说的出栈、入栈操作都是对st(i)的影响
src,dst,dest,op等都是指指令的操作数,src表示源操作数,dst/dest表示目的操作数 mem8,mem16,mem32,mem64,mem80等表示是内存操作数,后面的数值表示该操作数的
内存位数(8位为一字节)
x <- y 表示将y的值放入x,例st(0) <- st(0) - st(1)表示将st(0)-st(1)的值放入浮点寄存器st(0)
1. 数据传递和对常量的操作指令 指令格式 指令含义 执行的操作 FLD src 装入实数到st(0)
st(0) <- src (mem32/mem64/mem80) FILD src 装入整数到st(0)
st(0) <- src (mem16/mem32/mem64)
FBLD src
装入BCD数到st(0) st(0) <- src (mem80) FLDZ
将0.0装入st(0) st(0) <- 0.0 FLD1
将1.0装入st(0) st(0) <- 1.0 FLDPI 将pi装入st(0) st(0) <- ?(ie, pi) FLDL2T
将log2(10)装入st(0) st(0) <- log2(10) FLDL2E
将log2(e)装入st(0) st(0) <- log2(e) FLDLG2
将log10(2)装入st(0) st(0) <- log10(2)
FLDLN2
将loge(2)装入st(0) st(0) <- loge(2) FST dest
保存实数st(0)到dest dest <- st(0) (mem32/mem64)
FSTP dest
dest <- st(0) (mem32/mem64/mem80);然后再执行一次出栈操作
FIST dest
将st(0)以整数保存到dest dest <- st(0) (mem32/mem64)
FISTP dest
dest <- st(0) (mem16/mem32/mem64);然后再执行一次出栈操作
FBST dest
将st(0)以BCD保存到dest
dest <- st(0) (mem80)
FBSTP dest
dest<- st(0) (mem80);然后再执行一次出栈操作2.比较指令 指令格式 指令含义 执行的操作 FCOM 实数比较
将标志位设置为 st(0) - st(1) 的结果标志位
FCOM op 实数比较
将标志位设置为 st(0) - op (mem32/mem64)的结果标志位 FICOM op 和整数比较
将Flags值设置为st(0)-op 的结果op (mem16/mem32)
FICOMP op
和整数比较
将st(0)和op比较 op(mem16/mem32)后;再执行一次出栈操作 FTST 零检测
将st(0)和0.0比较
FUCOM st(i)
比较st(0) 和st(i) [486]
FUCOMP st(i)
比较st(0) 和st(i),并且执行一次出栈操作
FUCOMPP st(i)
比较st(0) 和st(i),并且执行两次出栈操作 FXAM
Examine: Eyeball st(0) (set condition codes)3.运算指令
指令格式 指令含义 执行的操作 加法 FADD 加实数
st(0) <-st(0) + st(1)
FADD src
st(0) <-st(0) + src (mem32/mem64)
FADD st(i),st
st(i) <- st(i) + st(0)
FADDP st(i),st
st(i) <- st(i) + st(0);然后执行一次出栈操作
FIADD src 加上一个整数
st(0) <-st(0) + src (mem16/mem32) 减法 FSUB 减去一个实数 st(0) <- st(0) - st(1)
FSUB src
st(0) <-st(0) - src (reg/mem)
FSUB st(i),st
st(i) <-st(i) - st(0)
FSUBP st(i),st
st(i) <-st(i) - st(0),然后执行一次出栈操作
FSUBR st(i),st 用一个实数来减 st(0) <- st(i) - st(0)
FSUBRP st(i),st
st(0) <- st(i) - st(0),然后执行一次出栈操作
FISUB src 减去一个整数
st(0) <- st(0) - src (mem16/mem32)
FISUBR src 用一个整数来减
st(0) <- src - st(0) (mem16/mem32) 乘法 FMUL 乘上一个实数 st(0) <- st(0) * st(1)
FMUL st(i)
st(0) <- st(0) * st(i)
FMUL st(i),st
st(i) <- st(0) * st(i)
FMULP st(i),st
st(i) <- st(0) * st(i),然后执行一次出栈操作
FIMUL src 乘上一个整数
st(0) <- st(0) * src (mem16/mem32) 除法 FDIV 除以一个实数 st(0) <-st(0) /st(1)
FDIV st(i)
st(0) <- st(0) /t(i)
FDIV st(i),st
st(i) <-st(0) /st(i)
FDIVP st(i),st
st(i) <-st(0) /st(i),然后执行一次出栈操作
FIDIV src 除以一个整数
st(0) <- st(0) /src (mem16/mem32)
FDIVR st(i),st 用实数除 st(0) <- st(i) /st(0)
FDIVRP st(i),st
FDIVRP st(i),st
FIDIVR src 用整数除
st(0) <- src /st(0) (mem16/mem32) FSQRT 平方根
st(0) <- sqrt st(0) FSCALE 2的st(0)次方 st(0) <- 2 ^ st(0)
FXTRACT Extract exponent:
st(0) <-exponent of st(0); and gets pushed
st(0) <-significand of st(0) FPREM 取余数
st(0) <-st(0) MOD st(1)
FPREM1
取余数(IEEE),同FPREM,但是使用IEEE标准[486]FRNDINT 取整(四舍五入)
st(0) <- INT( st(0) ); depends on RC flag FABS 求绝对值
st(0) <- ABS( st(0) ); removes sign FCHS
改变符号位(求负数) st(0) <-st(0) F2XM1 计算(2 ^ x)-1 st(0) <- (2 ^ st(0)) - 1 FYL2X 计算Y * log2(X)
st(0)为Y;st(1)为X;将st(0)和st(1)变为st(0) * log2( st(1) )的值 FCOS 余弦函数Cos st(0) <- COS( st(0) ) FPTAN
正切函数tan st(0) <- TAN( st(0) ) FPATAN
反正切函数arctan st(0) <- ATAN( st(0) ) FSIN 正弦函数sin st(0) <- SIN( st(0) )
FSINCOS sincos函数
st(0) <-SIN( st(0) ),并且压入st(1)
st(0) <- COS( st(0) )FYL2XP1 计算Y * log2(X+1)
st(0)为Y; st(1)为X; 将st(0)和st(1)变为st(0) * log2( st(1)+1 )的值
处理器控制指令 FINIT
初始化FPUFSTSW AX 保存状态字的值到AX AX<- MSW
FSTSW dest
保存状态字的值到dest
dest<-MSW (mem16)FLDCW src 从src装入FPU的控制字 FPU CW <-src (mem16)
FSTCW dest
将FPU的控制字保存到dest dest<- FPU CWFCLEX 清除异常 FSTENV dest
保存环境到内存地址dest处 保存状态字、控制字、标志字和异常指针的值
FLDENV src
从内存地址src处装入保存的环境FSAVE dest 保存FPU的状态到dest处 94字节FRSTOR src 从src处装入由FSAVE保存的FPU状态 FINCSTP
增加FPU的栈指针值
st(6) <-st(5); st(5) <-st(4),...,st(0) <-?
FDECSTP
减少FPU的栈指针值
st(0) <-st(1); st(1) <-st(2),...,st(7) <-? FFREE st(i) 标志寄存器st(i)未被使用 FNOP
空操作,等同CPU的nop st(0) <-st(0)
WAIT/FWAIT
同步FPU与CPU:停止CPU的运行,直到FPU完成当前操作码 FXCH
交换指令,交换st(0)和st(1)的值 st(0) <-st(1)
st(1) <- st(0)
正在阅读:
汇编FPU浮点运算07-06
普通话水平测试评分表06-23
找不到一团体替代你10-29
javaEE 学生基本信息管理系统05-12
西方经济学网上作业和期末考试答案(02 - 06)01-21
2018销售年终工作总结最新08-23
出纳实训习题11-12
浅谈低年级数学教学09-20
人教版小学数学二年级下册第2单元测试题10-28
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 浮点
- 运算
- 汇编
- FPU
- 四川省中医医院评审标准(2) - 图文
- 成语儿歌100首(大显身手试一试)
- 五章 利用鱼粉废水产生的微生物絮凝剂
- 人教版初一数学(上)一对一提优讲义 第3讲.有理数四则运算(含答案
- 备战2012高考化学冲刺押题(高考预测)系列 专题02 化学物质及其
- 大旱河水毁修复和治理工程监理规划
- TYJL-ADX计算机联锁设备常见故障的应急处理方法探讨
- 计算机网考考复习题(客观题及答案 - 供学生查阅)
- 沂水天立能源有限公司庐山项目区集中供汽中心项目
- 第5章 函数
- 2018新部编本二年级下期语文第二单元教案完整版
- 2007石油和化工自动化行业科学技术奖-中国化工节能技术协会
- 管内配线工程施工技术交底
- 电镀实用技术培训
- 计算机应用基础试题(附答案)
- 市政二级建造师工程网络教育试题及答案(已通过)
- 对地方自行发债问题的分析
- 算法设计与分析复习题
- 第1章_信息技术概述
- 《变电站与个建筑物及市政设施距离》