发表评论:


你的名字:


你的电邮:


你的主页:


想说的话:

   

最后更新:



BLOGBUS。COM




00Counter.com



 
<<  编程用字体AJU YaHei_Consolas_CC1.0,完美混合微软雅黑 | 返回首页 | KEIL中一个让人晕倒的BUG  >> 



适合于51内核的64位开方程序
 发表于 2007-06-22

by AJU 

自己写的基于51内核的64位开方程序,在5M主频的515内核的71M6513里测试完成一次64位开方需要9ms左右,KEIL自带的32位浮点数开方完成一次需要6.5ms左右。32位浮点数的缺点就是精确度只有7位有效数字;而64位整数的精度要远远高于32位浮点数。

在KEIL中声明如下,即可直接调用;参数为64位整数的首地址,返回值为32位整数。程序使用10byte的DATA区临时变量。

extern unsigned long Sqrt64b(unsigned char data *yourL) small;

以下是汇编程序文件,没测试不要乱用哈~~ 嘿嘿。

ACC_0   BIT     ACC.0
ACC_1   BIT     ACC.1
ACC_2   BIT     ACC.2
ACC_3   BIT     ACC.3
ACC_4   BIT     ACC.4
ACC_5   BIT     ACC.5
ACC_6   BIT     ACC.6
ACC_7   BIT     ACC.7
F1      BIT     PSW.1

NAME SQRTA51_64B

?PR?_Sqrt64b?SQRTA51_64B                 SEGMENT CODE
?DT?_Sqrt64b?SQRTA51_64B                 SEGMENT DATA OVERLAYABLE
 PUBLIC _Sqrt64b

 RSEG  ?DT?_Sqrt64b?SQRTA51_64B
?_Sqrt64b?BYTE:
      myTmp?041:   DS   10
; unsigned long Sqrt64b(unsigned char data *yourL) small

 RSEG  ?PR?_Sqrt64b?SQRTA51_64B
_Sqrt64b:
 USING 0
   
   ; SOURCE LINE # 1
;---- Variable 'yourL?040' assigned to Register 'R0' ----
        MOV   R0,AR7
   
        CLR     A
        MOV     R4,A
        MOV     R5,A
        MOV     R6,A
        MOV     R7,A
       
        MOV     AR1,R0
        MOV     A,@R1
        INC     R1
        ORL     A,@R1
        INC     R1
        ORL     A,@R1
        INC     R1
        ORL     A,@R1
        INC     R1
        ORL     A,@R1
        INC     R1
        ORL     A,@R1
        INC     R1
        ORL     A,@R1
        INC     R1
        ORL     A,@R1
        JNZ     SH64B1
        RET   
SH64B1: CLR     A
        MOV     myTmp?041+0,A
        MOV     myTmp?041+1,A
        MOV     myTmp?041+2,A
        MOV     myTmp?041+3,A       
        ;MOV     myTmp?041+4,A       
       
        ;CLR     F1
        MOV     R1,#01H       
        MOV     A,@R0
        ;ANL     A,#0C0H
        RL      A
        RL      A
        MOV     @R0,A
        ANL     A,#03H
        MOV     myTmp?041+4,A
       
        //MOV     A,myTmp?041+4       ;tmp>1 ?   可省略
        //JNB     ACC_1,SH64B3
        JZ      SH64B3
        INC     R7       
        DEC     A
        MOV     myTmp?041+4,A
       
SH64B3: MOV     R2,#31
        ;CLR     F1
SH64B7: CLR     C    
          
        MOV     A,R7            ;R4 R5 R6 R7是N
        RLC     A
        MOV     myTmp?041+9,A
        MOV     R7,A
        MOV     A,R6
        RLC     A
        MOV     myTmp?041+8,A
        MOV     R6,A           
        ;JNB     F1,SH64B8           ;;;;;;;;;;;;;;;
        MOV     A,R5
        RLC     A
        MOV     myTmp?041+7,A
        MOV     R5,A
        MOV     A,R4           
        RLC     A
        MOV     myTmp?041+6,A
        MOV     R4,A           
       
SH64B8: SETB    C
        MOV     A,R7
        RLC     A
        MOV     R7,A
        MOV     A,R6
        RLC     A
        MOV     R6,A           
        MOV     A,R5
        RLC     A
        MOV     R5,A
        ;JNB     F1,S1               ;;;;;;;;;;;;;;;
        MOV     A,R4
        RLC     A
        MOV     R4,A        ;R4 R5 R6 R7 是ttp=4×N+1     
        CLR     A
        RLC     A
        MOV     R3,A
       
S1:     MOV     A,@R0
S2:     MOV     C,ACC_6
        MOV     F0,C
        MOV     C,ACC_7            
        RL      A
        RL      A
        MOV     @R0,A
       
        MOV     B,#02H
SH64B4: MOV     A,myTmp?041+4
        RLC     A
        MOV     myTmp?041+4,A
        MOV     A,myTmp?041+3
        RLC     A
        MOV     myTmp?041+3,A
        MOV     A,myTmp?041+2
        RLC     A
        MOV     myTmp?041+2,A
        ;JNB     F1,SH64B9           ;;;;;;;;;;;;;;;
        MOV     A,myTmp?041+1
        RLC     A
        MOV     myTmp?041+1,A
        MOV     A,myTmp?041+0
        RLC     A
        MOV     myTmp?041+0,A
SH64B9: MOV     C,F0
        DJNZ    B,SH64B4
       
        INC     R1 
        CJNE    R1,#04H,GO_ON1  
        MOV     R1,#0
        INC     R0
        ;SETB    F1
       
        SJMP    GO_ON1
DJNZjmp:SJMP    SH64B7
       
GO_ON1: CLR     C
        MOV     A,myTmp?041+4       ;R4 R5 R6 R7是Tmp -= ttp的结果
        SUBB    A,R7
        MOV     R7,A
        MOV     A,myTmp?041+3
        SUBB    A,R6
        MOV     R6,A
        MOV     A,myTmp?041+2
        SUBB    A,R5
        MOV     R5,A
        ;JNB     F1,SH64B10           ;;;;;;;;;;;;;;;
        MOV     A,myTmp?041+1
        SUBB    A,R4
        MOV     R4,A
        MOV     A,myTmp?041+0
        SUBB    A,R3
        MOV     R3,A
SH64B10:JC      SH64B5              ;Tmp>=ttp不成立
        MOV     myTmp?041+4,R7
        MOV     myTmp?041+3,R6
        MOV     myTmp?041+2,R5
        ;JNB     F1,SH64B11           ;;;;;;;;;;;;;;;
        MOV     myTmp?041+1,R4
        MOV     myTmp?041+0,R3
SH64B11:MOV     A,myTmp?041+9
        SETB    ACC_0
        MOV     R7,A
        MOV     R6,myTmp?041+8
        ;ADDC    A,#0
        ;MOV     R6,A               
        ;JNB     F1,SH64B6            ;;;;;;;;;;;;;;;
        MOV     R5,myTmp?041+7
        ;ADDC    A,#0
        ;MOV     R5,A
        MOV     R4,myTmp?041+6
        ;ADDC    A,#0
        ;MOV     R4,A                       
        SJMP    SH64B6
SH64B5: MOV     R7,myTmp?041+9
        MOV     R6,myTmp?041+8
        ;JNB     F1,SH64B6            ;;;;;;;;;;;;;;;
        MOV     R5,myTmp?041+7
        MOV     R4,myTmp?041+6       
SH64B6: /*CJNE    R2,#011H,SH64B12
        MOV     R5,#00H
        MOV     R4,#00H
        MOV     R3,#00H
        SETB    F1 */
SH64B12:DJNZ    R2,DJNZjmp       

 RET   
; END OF _Sqrt64b

 END






2007-06-22 23:37:57  | Trackback(0) | 编辑 





有人发表过这些评论:





模板设计:梵梦聆心