|
几天以来一直在用浮点库做验证,感觉不错
现在把遇到的问题和使用时要注意的事情说一下
1. 你如果是二进制数字,比如说是从AD采样过来的数据直接用于计算的,应该先把二进制转换浮点形式,你可以调用CNV04.S43里面的子程序,把二进制转换做浮点形式。
2. 浮点数的存储形式是,高16位存在低地址里面,低16位存在高地址里面
比如说十进制浮点数1.5,用浮点库表示是80400000。你要保存这个数据的时候,比如要保存在
200--203h这四个字节里面。要把8040H存在200H和201H这个地址里面,把0000H存在202h和230H里面。因为浮点库传递的是地址,它只把存放浮点数高位16地址传递给子程序。即把200H传递给子程序。子程序会默认把存放浮点数的低16位地址当作200H+2=202H。千万不要把低16位浮点放在1FEH和1FFh里面,不然就错了
3. CNV04.S43是转换整型的程序。比如说你的浮点数80400000h,表示成十进制是1.5,用CNV04.S43中的子程序转换时,只能转换出来整数1,0.5没有办法转换
要想显示小数点以后的数字,可以放大,比如说×10000000,以后你得到的整数就可以包括很多小数部分了
另外一个方法是,你的浮点数转换成BCD码后,小数部分被省略,再把BCD转换成浮点,这样再做减法,得到的就是小数部分了,再转换BCD后就很好了
给个简单的减法例子
X-Y=Z
比如说X=84000000H(浮点形式)
Y=83121200H(浮点形式)
MOV #8400H,290H
MOV #0H,292H
MOV #8312H,296H
MOV #1200H,297H
CALL #F_SU
F_SU
CALL #FLT_S×× ; 寄存器全部压栈保护(略)
SUB #(ML/8)+1,SP ; C05CH
MOV #290H,RPRES ; 将290h存放的是浮点的MSB
MOV #296H,RPARG ; 将VAL2的高字地址给RPARG
CALL #FLT_SUB
MOV 0(SP),RESULT ; 将结果保存在RESULT中 C06AH
MOV 2(SP),(RESULT+2) ;
ADD #(ML/8)+1,SP ;
CALL #FLT_REC ; 寄存器全部出栈(略)
RET
|
|