汇编FPU浮点运算_第1页
汇编FPU浮点运算_第2页
汇编FPU浮点运算_第3页
汇编FPU浮点运算_第4页
汇编FPU浮点运算_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、浮点执行环境的寄存器主要是8个通用数据寄存器和几个专用寄存器,它们是状态寄存器、控制寄存器、标记寄存器等8个浮点数据寄存器(FPU Data Register),编号FPR0 FPR7。每个浮点寄存器都是80位的,以扩展精度格式存储数据。当其他类型数据压入数据寄存器时,PFU自动转换成扩展精度;相反,数据寄存器的数据取出时,系统也会自动转换成要求的数据类型。      8个浮点数据寄存器组成首尾相接的堆栈,当前栈顶ST(0)指向的FPRx由状态寄存器中TOP字段指明。数据寄存器不采用随机存取,而是按照“后进先出”的堆栈原则工作,并且首尾循环。向

2、数据寄存器传送(Load)数据时就是入栈,堆栈指针TOP先减1,再将数据压入栈顶寄存器;从数据寄存器取出(Store)数据时就是出栈,先将栈顶寄存器数据弹出,再修改堆栈指针使TOP加1。浮点寄存器栈还有首尾循环相连的特点。例如,若当前栈顶TOP=0(即ST(0) = PFR0),那么,入栈操作后就使TOP=7(即使ST(0) = PFR7),数据被压入PFR7。所以,浮点数据寄存器常常被称为浮点数据栈。      为了表明浮点数据寄存器中数据的性质,对应每个FPR寄存器,都有一个2位的标记(Tag)位,这8个标记tag0 tag7组成一个16位

3、的标记寄存器。 在计算机中,实数的浮点格式(Floating-Point Format)所示,分成指数、有效数字和符号位三个部分。·  符号(Sign)表示数据的正负,在最高有效位(MSB)。负数的符号位为1,正数的符号为0。·  指数(Exponent)也被称为阶码,表示数据以2为底的幂。指数采用偏移码(Biased Exponent)表示,恒为整数。·  有效数字(Significand)表示数据的有效数字,反映数据的精度。有效数字一般采用规格化(Normalized)形式,是一个纯小数,所以也被称为尾数(Mantiss

4、a)、小数或分数(Fraction)。      80x87支持三种浮点数据类型:单精度、双精度和扩展精度;它们的长度依次为32、64和80位,即4、8和10个字节;它们遵循美国IEEE(电子电气工程师协会)定义的国际标准浮点格式。·  单精度浮点数(32位短实数)由1位符号、8位指数、23位有效数组成。·  双精度浮点数(64位长实数)由1位符号、11位指数、52位有效数组成。·  扩展精度浮点数(80位临时实数)由1位符号、15位指数、64位有效数组成。很多计算机中并没有80位扩展

5、精度这种数据类型,80x87 FPU主要在内部使用它存贮中间结果,以保证最终数值的精度。浮点处理单元FPU具有自己的指令系统,共有几十种浮点指令,可以分成传送、算术运算、超越函数、比较、FPU控制等类。浮点指令归属于ESC指令,其前5位的操作码都是11011b,它的指令助记符均以F开头。1. 浮点传送类指令    浮点数据传送指令完成主存与栈顶st(0)、数据寄存器st(i)与栈顶之间的浮点格式数据的传送。浮点数据寄存器是一个首尾相接的堆栈,所以它的数据传送实际上是对堆栈的操作,有些要改变堆栈指针TOP,即修改当前栈顶。2. 算术运算类指令  

6、  这类浮点指令实现浮点数、16/32位整数的加、减、乘、除运算,它们支持的寻址方式相同。这组指令还包括有关算术运算的指令,例如求绝对值、取整等。3. 超越函数类指令    浮点指令集中包含有进行三角函数、指数和对数运算的指令。4. 浮点比较类指令    浮点比较指令比较栈顶数据与指定的源操作数,比较结果通过浮点状态寄存器反映。5. FPU控制类指令    FPU控制类指令用于控制和检测浮点处理单元FPU的状态及操作方式。采用浮点指令的汇编语言程序格式,与整数指令源程序格式是类似的,但有以下几点

7、需要注意:·  使用FPU选择伪指令      由于汇编程序MASM默认只识别8086指令,所以要加上.8087 / .287 / .387等伪指令选择汇编浮点指令;有时,还要加上相应的.238/.386等伪指令。·  定义浮点数据      我们知道,数据定义伪指令dd(dword) / dq(qword) / dt(tbyte)依次说明32/64/80位数据;它们可以用于定义单精度、双精度和扩展精度浮点数。为了区别于整数定义,MASM 6.11建议采用

8、REAL4、REAL8、REAL10定义单、双、扩展精度浮点数,但不能出现纯整数(其实,整数后面补个小数点就可以了)。相应的数据属性依次是dword、qword、tbyte。另外,实常数可以用E表示10的幂。·  初始化浮点处理单元      每当执行一个新的浮点程序时,第一条指令都应该是初始化FPU的指令finit。该指令清除浮点数据寄存器栈和异常,为程序提供一个“干净”的初始状态。否则,遗留在浮点寄存器栈中的数据可能会产生堆栈溢出。另一方面,浮点指令程序段结束,也最好清空浮点数据寄存器。浮点传送程序  

9、;          .model small           .8087                 ;识别浮点指令           .

10、stack           .dataf32d       dd 100.25             ;单精度浮点数:42C88000 hf64d       dq -0.2109375     

11、0;   ;双精度浮点数:BFCB000000000000 hf80d       dt 100.25e9           ;扩展精度浮点数:4023BABAECD400000000 hi16d       dw 100           &#

12、160;    ;字整数:0064 hi32d       dd -1234              ;短整数:FFFFFB2E hi64d       dq 123456h            ;长整数:

13、0000000000123456 hb80d       dt 123456h            ;BCD码数:00000000000000123456 hib32       dd ?bi80       dt ?       

14、60;   .code           .startupstart1:    finit                 ;初始化FPU           fld f32d 

15、             ;压入单精度浮点数f32d           fld f64d              ;压入双精度浮点数f64d         

16、;  fld f80d              ;压入扩展精度浮点数f80d           fld st(1)             ;压入当前st(1),即f64d     &#

17、160;     fild i16d             ;压入字整数i16d           fild i32d             ;压入短整数i32d    &#

18、160;      fild i64d             ;压入长整数i64d           fbld b80d             ;压入BCD码数b80dstart2:  

19、;  fist dword ptr ib32   ;将栈顶(现为b80d)以短整数保存           fxch                  ;st(0)与st(1)互换,现栈顶为i64d        

20、60;  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等表示是内存操作数,后面的数值表示该操作数的内存

21、位数(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

22、将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)到destdest <- st(0) (mem32/mem64)FSTP destdest <- s

23、t(0) (mem32/mem64/mem80);然后再执行一次出栈操作FIST dest将st(0)以整数保存到destdest <- st(0) (mem32/mem64) FISTP destdest <- st(0) (mem16/mem32/mem64);然后再执行一次出栈操作FBST dest将st(0)以BCD保存到destdest <- st(0) (mem80) FBSTP dest dest<- st(0) (mem80);然后再执行一次出栈操作2比较指令指令格式指令含义执行的操作FCOM实数比较将标志位设置为 st(0) - st(1) 的结果标志

24、位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) 486FUCOMP st(i) 比较st(0) 和st(i),并且执行一次出栈操作FUCOMPP st(i) 比较st(0) 和st(i),并且执行两次出栈操作FXAM Examine: Eyeb

25、all st(0) (set condition codes)3运算指令 指令格式指令含义执行的操作加法FADD加实数st(0) <-st(0) + st(1)FADD srcst(0) <-st(0) + src (mem32/mem64)FADD st(i),stst(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) -

26、 st(1)FSUB srcst(0) <-st(0) - src (reg/mem)FSUB st(i),stst(i) <-st(i) - st(0)FSUBP st(i),stst(i) <-st(i) - st(0),然后执行一次出栈操作FSUBR st(i),st用一个实数来减st(0) <- st(i) - st(0)FSUBRP st(i),stst(0) <- st(i) - st(0),然后执行一次出栈操作FISUB src减去一个整数st(0) <- st(0) - src (mem16/mem32)FISUBR src用一个整数来减st

27、(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),stst(i) <- st(0) * st(i)FMULP st(i),stst(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)

28、 <- st(0) /t(i)FDIV st(i),stst(i) <-st(0) /st(i)FDIVP st(i),stst(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),stFDIVRP st(i),stFIDIVR src 用整数除st(0) <- src /st(0) (mem16/mem32)FSQRT平方根st(0) <- sq

29、rt st(0)FSCALE2的st(0)次方st(0) <- 2 st(0)FXTRACTExtract 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标准486FRNDINT 取整(四舍五入)st(0) <- INT( st(0) ); depends on RC flagFABS求绝对值st(0) <- ABS( st(0) ); removes signFCHS改变符号位(求负数)st(0) <-st(0)F2XM1计算(2 x)-1st(0) <- (2 st(0) - 1FYL2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论