打印

最据山寨特色的《中颖快速浮点乘、除法程库》!!!

[复制链接]
10581|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、简介
浮点数的运算,一贯比定点数慢很多,在C51中,浮点数乘除法,由于缺少相适应指令,运算速度超级慢,比浮点数加减法,慢不是一个等级,极大的影响了51单片机的实时运算速度,本文中,依靠中颖SH79/88/89系列的特色----准16位乘除指令,对所有关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的乘除运算,均作了运算速度大幅度提升,为方便使用,以外挂库形式加入,实行对C51内库自动替换,无缝嵌入。

其中最具有山寨特色的是float型的除法运算,便用中颖SH79/88/89系列的准16位乘除指令,经过简单的组合运算,代替原Keil C51的加减法模拟除法程序,大幅度地提升了原float型的除法的运算速度,解决了原51浮点除法特慢的通病。


二、中颖专用乘除库清单
/*
extern uint16   imul(uint16 value1,uint16 value2);          // 16位*16位-->16位(无符号二进制乘法)   
extern uint16  uidiv(uint32 value1,uint16 value2);       // 16位/16位-->16位(无符号二进制除法)   
extern uint32   lmul(uint32 value1,uint32 value2);          // 32位*32位-->32位(无符号二进制乘法)   
extern uint32  uldiv(uint32 value1,uint32 value2);       // 32位/32位-->32位(无符号二进制除法)   
extern float   fpmul(float value1, float value2);           // 二进制浮点数快速乘法  
extern float   fpdiv(float value1, float value2);           // 二进制浮点数快速除法  
*/


三、便用说明
只需要在编译程序过程中国,加入《中颖专用乘除库》----MATH_SH88F51.LIB,其他什么事都不用干!在编译过程中实现自动替换原C51库函数,无缝嵌入。


四、友情提示
本《中颖专用乘除库》,仅适用于中颖SH79/88/89系列单片机,其他51单片机并不适用,由于Keil C51不支持中颖51单片机的软件仿真,所以必须要用中颖51单片机的硬件仿真或依靠中颖51单片机的实时运行,运算结果才能正确。

相关帖子

沙发
Cortex-M0|  楼主 | 2011-10-1 19:57 | 只看该作者
《中颖专用乘除库》

math_sh88f51.rar (10.02 KB)

使用特权

评论回复
板凳
goodboy3021| | 2011-10-1 20:08 | 只看该作者
有用,占位支持!下载使用!

使用特权

评论回复
地板
Cortex-M0|  楼主 | 2011-10-1 20:16 | 只看该作者
本《中颖专用乘除库》,增加了若干非常实用的,无符号、有符号定点多字节乘法、除法子程序库,还有一个特色就是,增加了无符号、有符号定点多字节除法同时取商和余数子程序库,对同时需要用到这两个参数的场合,极大地提高了运行速度,使用时只需在C程序中,插入如下头本件 global.h 即可。

/***************************************************************************************
Model  : global.h
Description : Head file of defining global variable.
Author  : CLR
Create Time : 2011-09-29
Version ID  : 1.3
用  途      :中颖SH79/88/89F51系列MCU
作  者      :许意义
21ic  ID    :LAOXU
中颖论坛    : bbs.21ic.com   
****************************************************************************************/
#ifndef  _GLOBAL_H
#define  _GLOBAL_H

#pragma  MODDP2     // 打开中颖单片机双DPTR功能,加速数据传送
//#pragma  NOMODDP2    // 关闭中颖单片机双DPTR功能

/*--------------------------------------------------------------------------------------*/
/*      Resource - math.asm            */
/*--------------------------------------------------------------------------------------*/
extern  uint8 ascii_hex(uint8 value1);     //  1位 ASCII        --> 1位 HEX(低半字节)
extern  uint8 hex_ascii(uint8 value1);     //  1位 HEX(低半字节)--> 1位 ASCII
extern  uint8 bcd8_hex(uint8 value1);         //  8位 BCD --> 8位 HEX
extern uint16  bcd16_hex(uint16 value1);        // 16位 BCD -->16位 HEX
extern uint32  bcd32_hex(uint32 value1);        // 32位 BCD -->32位 HEX      
extern  uint16 hex8_bcd(uint8 value1);         //  8位 HEX -->16位 BCD
extern uint32  hex16_bcd(uint16 value1);        // 16位 HEX -->32位 BCD
extern uint32  hex32_bcd(uint32 value1);        // 32位 HEX -->32位 BCD      
extern  uint32  mul16_8(uint16 value1,uint8 value2);  // 16位* 8位-->32位(无符号二进制乘法)  
extern  uint32  mul16(uint16 value1,uint16 value2);   // 16位*16位-->32位(无符号二进制乘法)
extern  uint32  mul32_8(uint32 value1,uint8 value2);  // 32位* 8位-->32位(无符号二进制乘法)  
extern  uint32  mul32_16(uint32 value1,uint16 value2);  // 32位*16位-->32位(无符号二进制乘法)  
extern  uint32  mul32(uint32 value1,uint32 value2);      // 32位*32位-->32位(无符号二进制乘法)  
extern uint16  div16_8(uint16 value1,uint8 value2);   // 16位/ 8位-->16位(无符号二进制除法)
extern  uint16  div16(uint16 value1,uint16 value2);   // 16位/16位-->16位(无符号二进制除法)
extern  uint32  div32_8(uint32 value1,uint8 value2);  // 32位/ 8位-->32位(无符号二进制除法)
extern  uint32  div32_16(uint32 value1,uint16 value2);  // 32位/16位-->32位(无符号二进制除法)
extern  uint32  div32(uint32 value1,uint32 value2);      // 32位/32位-->32位(无符号二进制除法)
extern uint8  mod16_8(uint16 value1,uint8 value2);  // 16位% 8位--> 8位(无符号二进制取余数)
extern uint16  mod16(uint16 value1,uint16 value2);   // 16位%16位-->16位(无符号二进制取余数)  
extern uint8   mod32_8(uint32 value1,uint8 value2);   // 32位% 8位--> 8位(无符号二进制取余数)
extern uint16 mod32_16(uint32 value1,uint16 value2);   // 32位%16位-->16位(无符号二进制取余数)  
extern uint32 mod32(uint32 value1,uint32 value2);      // 32位%32位-->32位(无符号二进制取余数)   
extern uint16  div16_8m(uint16 value1,uint8 value2,uint8 data *p);    // 16位/ 8位-->16位(无符号二进制除法及取余数,8位余数存*p)
extern uint16  div16m(uint16 value1,uint16 value2,uint16 data *p);    // 16位/16位-->16位(无符号二进制除法及取余数,16位余数存*p)
extern uint32  div32_8m(uint32 value1,uint8 value2,uint8 data *p);    // 32位/ 8位--> 8位(无符号二进制除法及取余数,8位余数存*p)
extern uint32 div32_16m(uint32 value1,uint16 value2,uint16 data *p); // 32位/16位-->16位(无符号二进制除法及取余数,16位余数存*p)
extern uint32 div32m(uint32 value1,uint32 value2,uint32 data *p);    // 32位/32位-->32位(无符号二进制除法及取余数,32位余数存*p)   
extern  int32  smul16_8(int16 value1,int8 value2);      // 16位* 8位-->32位(有符号二进制补码乘法)  
extern  int32  smul16(int16 value1,int16 value2);      // 16位*16位-->32位(有符号二进制补码乘法)
extern  int32  smul32_8(int32 value1,int8 value2);      // 32位* 8位-->32位(有符号二进制补码乘法)  
extern  int32  smul32_16(int32 value1,int16 value2);     // 32位*16位-->32位(有符号二进制补码乘法)  
extern  int32  smul32(int32 value1,int32 value2);      // 32位*32位-->32位(有符号二进制补码乘法)  
extern int16  sdiv16_8(int16 value1,int8 value2);       // 16位/ 8位-->16位(有符号二进制补码除法)
extern  int16  sdiv16(int16 value1,int16 value2);      // 16位/16位-->16位(有符号二进制补码除法)
extern  int32  sdiv32_8(int32 value1, int8 value2);      // 32位* 8位-->32位(有符号二进制补码乘法)   
extern  int32  sdiv32_16(int32 value1,int16 value2);     // 32位/16位-->32位(有符号二进制补码除法)
extern  int32  sdiv32(int32 value1,int32 value2);      // 32位/32位-->32位(有符号二进制补码除法)
extern int8   smod16_8(int16 value1,int8 value2);      // 16位% 8位--> 8位(有符号二进制补码取余数)
extern int16  smod16(int16 value1,int16 value2);      // 16位%16位-->16位(有符号二进制补码取余数)  
extern int8   smod32_8(int32 value1,int8 value2);       // 32位% 8位--> 8位(有符号二进制补码取余数)
extern int16  smod32_16(int32 value1,int16 value2);     // 32位%16位-->16位(有符号二进制补码取余数)  
extern int32  smod32(int32 value1,int32 value2);      // 32位%32位-->32位(有符号二进制补码取余数)   
extern int16  sdiv16_8m(int16 value1,int8 value2,int8 data *p); // 16位/ 8位-->16位(有符号二进制除法及取余数,8位余数存*p)
extern int16  sdiv16m(int16 value1,int16 value2,int16 data *p); // 16位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern int32  sdiv32_8m(int32 value1,int8 value2,int8 data *p);  // 32位/ 8位--> 8位(有符号二进制除法及取余数,8位余数存*p)
extern int32  sdiv32_16m(int32 value1,int16 value2,int16 data *p); // 32位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern int32  sdiv32m(int32 value1,int32 value2,int32 data *p); // 32位/32位-->32位(有符号二进制除法及取余数,32位余数存*p)   

extern  void  ld_pdata(int8 addr1, int8 addr2, int8 len);   //  @PDATA --> @IDATA(len字节PDATA读入片内IDATA RAM)
extern  void  st_pdata(int8 addr1, int8 addr2, int8 len);   //  @IDATA --> @PDATA(len字节片内IDATA RAM存入PDATA)

/*  中颖单片机C51定点库内部调用函数   
extern  int32 st_r03_r47(void);             //  R0R1R2R3 ---> R4R5R6R7
extern  int16 neg(void);                     //  -(R6R7)  ---> R6R7
*/

/*  中颖单片机C51定点库、浮点库自动调用专用运算库函数,合适有效地插入了中颖SH79/88/89系列的特色----准16位乘除指令,对所有
    关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的乘除运算,均作了运算速度大幅度提升,为方便使用,以外
挂库形式加入,实行对C51内库自动替换,无缝嵌入,其中最具有特色的是float型的除法运算,用中颖SH79/88/89系列的准16位乘除指
令,代替原Keil C51的加减法模拟除法程序,大幅度地提升了原float型的除法的运算速度,解决了原51浮点除法特慢的通病。

extern uint16   imul(uint16 value1,uint16 value2);          // 16位*16位-->16位(无符号二进制乘法)   
extern uint16  uidiv(uint32 value1,uint16 value2);       // 16位/16位-->16位(无符号二进制除法)   
extern uint32   lmul(uint32 value1,uint32 value2);          // 32位*32位-->32位(无符号二进制乘法)   
extern uint32  uldiv(uint32 value1,uint32 value2);       // 32位/32位-->32位(无符号二进制除法)   
extern float   fpmul(float value1, float value2);           // 二进制浮点数快速乘法  
extern float   fpdiv(float value1, float value2);           // 二进制浮点数快速除法  
*/

#endif


global.rar (2.27 KB)

使用特权

评论回复
5
Cortex-M0|  楼主 | 2011-10-1 20:19 | 只看该作者
欢迎各路盆友下载使用~~~

使用特权

评论回复
6
highgear| | 2011-10-1 22:10 | 只看该作者
我顶,这对于算术运算的程序员简直是福音。
不做的人不知道,做过的人都知道。

使用特权

评论回复
7
Cortex-M0|  楼主 | 2011-10-1 22:27 | 只看该作者
谢谢highgear老师支持~~~

这个程序库,最难的就是51的浮点数快速除法,今天花了大半天时间,来研究51的浮点数快速除法,充分使用了中颖SH79/88/89系列的特色----准16位乘除指令,对原Keil C51的加减法模拟除法库程序,进行改造,
经过简单的组合运算,成功替代原Keil C51的浮点除法库程序时,还是很兴奋的,程序编写其实很简单,关健是算法的从理论到实践的验证~~~

在8051上,要实现32位快速浮点数除法,并不容易,感谢中颖,感谢中颖51,感谢中颖51单片机的准16位乘除指令,让俺实现了用乘除组合运算,成功替代了原C51用加减法模拟除法的库函数,实际运算速度大幅度提升~~~

使用特权

评论回复
8
Cortex-M0|  楼主 | 2011-10-1 22:36 | 只看该作者
将改写的中颖51快速浮点数乘法、除法哂一晒,供有情人参考~~~


中颖51快速浮点数乘法程序FPMUL.A51

$NOMOD51

NAME ?C?FPMUL

/**********************************************************************************************
* float R4R5R6R7 fpmul(float R4R5R6R7, float R0R1R2R3);
* result = value1 * value2
* R4R5R6R7 = R4R5R6R7 * R0R1R2R3
* 32位*32位-->32位(4字节浮点数快速乘法)

用 途 :中颖SH79/88/89F51系列MCU
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
日 期 : 2011-09-29

**********************************************************************************************/

?PR?_FPMUL?FPMUL SEGMENT CODE
EXTRN CODE (_FPRET_1)
EXTRN CODE (_FPRET_2)
EXTRN CODE (_FPRET_3)
EXTRN CODE (_FPRET_4)
EXTRN CODE (_FPRET_5)
EXTRN CODE (_FPRET_6)
PUBLIC ?C?FPMUL
RSEG ?PR?_FPMUL?FPMUL
?C?FPMUL: MOV A,R4
ORL A,R5
JZ FMUL01
MOV A,R0
ORL A,R1
JNZ FMUL02
MOV A,R5
RLC A
MOV A,R4
RLC A
INC A
JZ FMUL03
CLR A
MOV R4,A
MOV R7,A
MOV R6,A
MOV R5,A
FMUL04: RET
FMUL01: MOV A,R1
RLC A
MOV A,R0
RLC A
INC A
JNZ FMUL04
FMUL03: LJMP _FPRET_4
FMUL02: LCALL _FPRET_1
ANL A,R0
INC A
JZ FMUL07
CLR A
XCH A,R4
ADD A,#81H
JNC FMUL08
ADD A,R0
JNC FMUL09
FMUL07: LJMP _FPRET_6
FMUL08: ADD A,R0
JC FMUL09
LJMP _FPRET_5
FMUL09: PUSH ACC
ORL 0x86,#0x0c
MOV A,R3
ORL A,R2
JNZ FMUL12
CJNE R1,#0x80,FMUL19
FMUL15: POP ACC
MOV R3,A
LJMP _FPRET_3
FMUL19: MOV A,R7
ORL A,R6
JNZ FMUL14
CJNE R5,#0x80,FMUL20
FMUL21: MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
MOV A,R1
MOV R5,A
SJMP FMUL15
FMUL20: MOV 0xF1,#0
MOV A,R1
MOV B,R5
MUL AB
MOV R6,A
MOV A,B
LJMP FMUL16
FMUL18: MOV A,R1
XCH A,R5
MOV R1,A
MOV A,R2
MOV R6,A
MOV A,R3
MOV R7,A
FMUL14: MOV 0xF1,R6
MOV A,R7
MOV B,R1
MUL AB
MOV R4,A
MOV R7,B
MOV A,0xF1
XCH A,R5
MOV 0xF1,#0
MOV B,R1
MUL AB
ADD A,R5
MOV R6,A
CLR A
ADDC A,B
SJMP FMUL16
FMUL12: MOV A,R7
ORL A,R6
JNZ FMUL17
CJNE R5,#0x80,FMUL18
SJMP FMUL21
FMUL17: MOV 0xF1,R6
MOV A,R7
MOV B,R3
MUL AB
MOV R4,B
MOV R0,0xF1
MOV 0xF1,R6
MOV A,R7
MOV B,R2
MUL AB
ADD A,R4
MOV A,B
ADDC A,R0
MOV R4,A
CLR A
ADDC A,0xF1
MOV R0,A
MOV 0xF1,R6
MOV A,R7
MOV B,R1
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R0
MOV R7,A
CLR A
ADDC A,0xF1
MOV R0,A
MOV 0xF1,R2
MOV A,R3
MOV B,R5
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R7
MOV R7,A
MOV A,0xF1
ADDC A,R0
MOV R6,A
CLR A
MOV 0xF1,A
RLC A
XCH A,R5
MOV B,R1
MUL AB
ADD A,R6
MOV R6,A
MOV A,B
ADDC A,R5
FMUL16: MOV R5,A
ANL 0x86,#0xf3
RLC A
POP ACC
MOV R3,A
JNC FMUL22
INC R3
CJNE R3,#0x00,FMUL23
LJMP _FPRET_6
FMUL22: MOV A,R4
ADD A,R4
MOV R4,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
FMUL23: LJMP _FPRET_2

END

使用特权

评论回复
9
Cortex-M0|  楼主 | 2011-10-1 22:39 | 只看该作者
中颖51快速浮点数除法程序FPDIV.A51

$NOMOD51

NAME ?C?FPDIV

/**********************************************************************************************
* float R4R5R6R7 fpmul(float R4R5R6R7, float R0R1R2R3);
* result = value1 / value2
* R4R5R6R7 = R4R5R6R7 / R0R1R2R3
* 32位/32位-->32位(4字节浮点数快速除法)

用 途 :中颖SH79/88/89F51系列MCU
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
日 期 : 2011-09-29

**********************************************************************************************/

?PR?_FPDIV?FPDIV SEGMENT CODE
EXTRN CODE (_FPRET_1)
EXTRN CODE (_FPRET_2)
EXTRN CODE (_FPRET_3)
EXTRN CODE (_FPRET_4)
EXTRN CODE (_FPRET_5)
EXTRN CODE (_FPRET_6)
PUBLIC ?C?FPDIV
DPL1 EQU 0x84
DPH1 EQU 0x85
RSEG ?PR?_FPDIV?FPDIV
FPDIV_4: LJMP _FPRET_6
?C?FPDIV: MOV A,R4
ANL A,R5
INC A
JZ FPDIV_1
MOV A,R0
ANL A,R1
INC A
JNZ FPDIV_2
FPDIV_1: LJMP _FPRET_4
FPDIV_2: LCALL _FPRET_1
ANL A,R0
INC A
JZ FPDIV_1
MOV A,R4
ORL A,R0
JZ FPDIV_1
MOV A,R4
JNZ FPDIV_3
MOV R5,A
MOV R6,A
MOV R7,A
RET
FPDIV_3: XCH A,R0
JZ FPDIV_4
ADD A,#0x81
XCH A,R0
JNC FPDIV_5
CLR C
SUBB A,R0
JZ FPDIV_6
JNC FPDIV_7
FPDIV_6: LJMP _FPRET_5
FPDIV_5: SUBB A,R0
JNC FPDIV_4
FPDIV_7: MOV DPL,A
MOV A,R1
ADD A,R1
ORL A,R3
ORL A,R2
JNZ FPDIV_8
MOV R3,DPL
LJMP _FPRET_3
FPDIV_8: CLR C
MOV A,R7
SUBB A,R3
MOV A,R6
SUBB A,R2
MOV A,R5
SUBB A,R1
JC FPDIV_9
CLR C
MOV A,R5
RRC A
MOV R5,A
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC DPL
// H0(R0) = ffff / R1
FPDIV_9: ORL 0x86,#0x0c
MOV A,#0xff
MOV 0xF1,A
MOV B,R1
DIV AB
MOV R0,A
PUSH DPL
// N0(R5R6R7R4) = R5R6R7<<8 + (R5R6R7*H0) (放大1字节)
MOV A,R7
MOV 0xF1,R6
MOV B,R0
MUL AB
MOV R4,A
MOV DPL1,A
MOV A,R7
ADD A,B
MOV R7,A
MOV DPH1,A
MOV A,R6
ADDC A,0xF1
MOV R6,A
MOV A,R5
MOV 0xF1,#0
MOV B,R0
MUL AB
ADD A,R6
MOV R6,A
MOV DPL,A
MOV A,B
ADDC A,R5
MOV R5,A
MOV DPH,A // R5R6R7R4 ---> 双DPTR
// D0(R2R3) = R1R2R3 + (R1R2R3*H0>>8)
MOV A,R3
MOV 0xF1,R2
MOV B,R0
MUL AB
MOV A,B
ADD A,R3
MOV R3,A
MOV A,0xF1
ADDC A,R2
MOV R2,A
MOV A,R1
MOV B,R0
MUL AB
ADD A,R2
MOV R2,A
// &(R2R3) = -D0 (2字节)
CLR C
CLR A
SUBB A,R3
MOV R3,A
CLR A
SUBB A,R2
MOV R2,A
// Q = N0 + A + B + C
// A = N0*& (丢3字节) R5R6R7R4(N0) * R2R3 ---> R5R6R7R4(A) | R5=0
LCALL NFPMUL32
LCALL NFPADD32
// B = A*& (丢3字节) R5R6R7R4(A) * R2R3 ---> R5R6R7R4(B) | R5R6=0
LCALL NFPMUL32
LCALL NFPADD32
// C = B*& (丢3字节) R5R6R7R4(B) * R2R3 ---> R5R6R7R4(C) | R5R6R7=0
LCALL NFPMUL32
LCALL NFPADD32
ANL 0x86,#0xf3
POP ACC
DEC A
MOV R3,A
MOV R5,DPH
MOV R6,DPL
MOV R7,DPH1
MOV R4,DPL1
LJMP _FPRET_2
// R5R6R7R4 * R2R3 ---> R5R6R7R4
NFPMUL32: MOV A,R3
MOV 0xF1,R2
MOV B,R4
MUL AB
MOV R1,B
MOV R4,0xF1
MOV A,R3
MOV 0xF1,R2
MOV B,R7
MUL AB
ADD A,R1
MOV A,B
ADDC A,R4
MOV R1,A
CLR A
ADDC A,0xF1
MOV R4,A
MOV A,R5
ORL A,R6
JZ NFPML32_1
MOV A,R3
MOV 0xF1,R2
MOV B,R6
MUL AB
ADD A,R1
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
ADDC A,0xF1
MOV R7,A
MOV A,R5
JZ NFPML32_2
MOV B,A
MOV A,R3
MOV 0xF1,R2
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R7
MOV R7,A
CLR A
MOV R5,A
ADDC A,0xF1
MOV R6,A
RET
NFPML32_1: MOV R7,#0
NFPML32_2: MOV R6,#0
MOV R5,#0
RET
// 双DPTR + R4R5R6R7 ---> 双DPTR
NFPADD32: MOV A,DPL1
ADD A,R4
MOV DPL1,A
MOV A,DPH1
ADDC A,R7
MOV DPH1,A
MOV A,DPL
ADD A,R6
MOV DPL,A
MOV A,DPH
ADDC A,R5
MOV DPH,A
RET

END

使用特权

评论回复
10
Cortex-M0|  楼主 | 2011-10-1 22:42 | 只看该作者
中颖51快速浮点数乘除法通用返回处理程序FPRET.A51


$NOMOD51

NAME _FPRET

/**********************************************************************************************
* float R4R5R6R7 fpret(float R4R5R6R7, float R0R1R2R3);
* result = value1 *^/ value2
* R4R5R6R7 = R4R5R6R7 *^/ R0R1R2R3
* 32位*32位-->32位(4字节浮点数乘除法返回处理程序)

用 途 :中颖SH79/88/89F51系列MCU
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
日 期 : 2011-09-29

**********************************************************************************************/

?PR?_FPRET?FPRET SEGMENT CODE
PUBLIC _FPRET_1
PUBLIC _FPRET_2
PUBLIC _FPRET_3
PUBLIC _FPRET_4
PUBLIC _FPRET_5
PUBLIC _FPRET_6

RSEG ?PR?_FPRET?FPRET
_FPRET_1: MOV A,R1
SETB ACC.7
XCH A,R1
RLC A
MOV A,R0
RLC A
MOV R0,A
MOV PSW.5,C
MOV A,R5
SETB ACC.7
XCH A,R5
RLC A
MOV A,R4
RLC A
MOV R4,A
JNC FPT_01
CPL PSW.5
FPT_01: RET
_FPRET_2: MOV A,R4
JNB ACC.7,_FPRET_3
INC R7
CJNE R7,#0x00,_FPRET_3
INC R6
CJNE R6,#0x00,_FPRET_3
INC R5
CJNE R5,#0x00,_FPRET_3
INC R3
MOV A,R3
JZ _FPRET_6
_FPRET_3: MOV C,PSW.5
MOV A,R3
RRC A
MOV R4,A
MOV A,R5
MOV ACC.7,C
MOV R5,A
RET
_FPRET_4: MOV A,#0xFF
FPT_02: MOV R4,A
MOV R5,A
FPT_03: MOV R6,A
MOV R7,A
RET
_FPRET_5: CLR A
SJMP FPT_02
_FPRET_6: MOV C,PSW.5
MOV A,#0xFF
RRC A
MOV R4,A
MOV R5,#0x80
CLR A
SJMP FPT_03

END

使用特权

评论回复
11
zoomone| | 2011-10-2 12:56 | 只看该作者
有时间了就钻研钻研

使用特权

评论回复
12
highgear| | 2011-10-5 08:23 | 只看该作者
顶出水面

使用特权

评论回复
13
zxcscm| | 2011-10-18 08:59 | 只看该作者
来顶,顶~顶!

使用特权

评论回复
14
xubx83| | 2011-10-18 16:38 | 只看该作者
顶个先

使用特权

评论回复
15
zoomone| | 2011-10-20 12:57 | 只看该作者
能不能介绍一下怎么设置和使用的,我添加后编译老是出错

使用特权

评论回复
16
Cortex-M0|  楼主 | 2011-10-20 16:42 | 只看该作者
关键这几点设置。







打包给个带工程的DEMO测试文件

MAIN.rar (39.3 KB)

使用特权

评论回复
17
zoomone| | 2011-10-20 17:57 | 只看该作者
extern uint16   imul(uint16 value1,uint16 value2);          // 16位*16位-->16位(无符号二进制乘法)   
extern uint16  uidiv(uint32 value1,uint16 value2);       // 16位/16位-->16位(无符号二进制除法)   
extern uint32   lmul(uint32 value1,uint32 value2);          // 32位*32位-->32位(无符号二进制乘法)   
extern uint32  uldiv(uint32 value1,uint32 value2);       // 32位/32位-->32位(无符号二进制除法)   
extern float   fpmul(float value1, float value2);           // 二进制浮点数快速乘法  
extern float   fpdiv(float value1, float value2);           // 二进制浮点数快速除法  

为什么这几个函数不能用?

使用特权

评论回复
18
Cortex-M0|  楼主 | 2011-10-20 18:58 | 只看该作者
不是这几个函数不能用,这几个函数和 Keil C51内部库函数重名,也就是说,只要在编译时加入 math_sh88f51.lib ,  将自动替代原 Keil C51内部库函数,实现无缝嵌入,在实际使用中,你根本不需要管这些库函数的存在。
例如:  int  a,b,c;
         float  x,y,z;
         c = a * b / c;
         z = x * y / z;
Keil C51将自动调用上述SH88F51专用库函数,替代原 Keil C51内部库函数,实现无缝嵌入。

使用特权

评论回复
19
zoomone| | 2011-10-20 19:07 | 只看该作者
噢 看来不会的还很多:L

使用特权

评论回复
20
Cortex-M0|  楼主 | 2011-10-20 19:52 | 只看该作者
友情提示:
假如你调用上述库函数,脱离SH88F51的真实运行环境,如用Keil C51软件仿真,或将程序装载到其他厂家的51单片机中运行,将出错,无法得到预期的结果~~~

本库只有在特定的环境中,即在SH88F51的硬件支持下,运行结果才会正确。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:学习chunyang和maychang两位老师,努力练好基本功。 学习HOT大叔,学好“Cortex-M0”,做“Cortex-M0”之菜鸟。

7

主题

4820

帖子

12

粉丝