放牧代码和思想
专注自然语言处理、机器学习算法

X86汇编浮点计算为何要finit

每当执行一个新的浮点程序时,第一条指令都应该是初始化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装入</SPA

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » X86汇编浮点计算为何要finit

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机