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
|