• Главная • Назад •








Counter

 


Во многих приложениях возникаем необходимость извлечения квадратного корня. Здесь приведены программы извлечения квадратного корня от Microchip и наши разработки (семейство PIC18). Приведенные программы предназначены для извлечения корня из 16 и 32 битных чисел. Для тестирования для 32 битного преобразования использовалось число  3759317312, для 16 битного число 53064. При тестировании получены следующие значения.

 

Наименование Количество переменных Количество циклов
Microchip Sqrt16 18 157
Microchip Sqrt32 18 1002
CH Sqrt16 7 262
CH Sqrt32 14 725

Примеры программ для сравнения.

CH Sqrt16

CH Sqrt32

Microchip Sqrt16/32

; вычисление квадратного корня 16 бит
; CHSQRT16(T2h:T2l) = Ah:Al
 CHSQRT16 ;
     clrf T4l ;
     clrf T4h ;
      movlw .1 ;
      movwf Al ;
      movlw .0 ;
      movwf Ah ;

      movlw .8 ;
      movwf Bl ;
go21
      bcf STATUS,C ;
      rlcf T2l ;
      rlcf T2h ;
      rlcf T4l ;
      rlcf T4h ;
      bcf STATUS,C ;
      rlcf T2l ;
      rlcf T2h ;
      rlcf T4l ;
      rlcf T4h ;
      btfss STATUS,N ;
      bra pol16
      movf Al,w ;
      addwf T4l,f ;
      movf Ah,w ;
      addwfc T4h,f ;
      bra dol16
pol16
      movf Al,w ;
      subwf T4l,f ;
      movf Ah,w ;
      subwfb T4h,f ;
dol16
      bcf STATUS,C ;
      rlcf Al ;
      rlcf Ah ;
      movlw b'11111000' ;
      andwf Al ;
      movlw b'00000101' ;
      iorwf Al ;

      btfss T4h, 7 ;
      bra per16 ;
      movlw .2 ;
      subwf Al ;
      per16
      decfsz Bl,f
      bra go21 ;
      bcf STATUS,C ;
      rrcf Ah ;
      rrcf Al ;
      bcf STATUS,C ;
      rrcf Ah ;
      rrcf Al ;
      return ;
; вычисление квадратного корня 32 бита
; CHSQRT32(T4h:T4l:T2h:T2l) = Ah:Al
CHSQRT32
     clrf T6l ;
     clrf T6h ;
     clrf T8l ;
     clrf T8h ;

     movlw .1 ;
     movwf Al ;
     movlw .0 ;
     movwf Ah ;

     clrf Bl ;
     clrf Bh ;

     movlw .16 ;
     movwf Cl ;
go34
     bcf STATUS,C ;
     rlcf T2l ;
     rlcf T2h ;
     rlcf T4l ;
     rlcf T4h ;
     rlcf T6l ;
     rlcf T6h ;
     rlcf T8l ;
     rlcf T8h ;
     bcf STATUS,C ;
     rlcf T2l ;
     rlcf T2h ;
     rlcf T4l ;
     rlcf T4h ;
     rlcf T6l ;
     rlcf T6h ;
     rlcf T8l ;
     rlcf T8h ;
     btfss STATUS,N ;
     bra pol
     movf Al,w ;
     addwf T6l,f ;
     movf Ah,w ;
     addwfc T6h,f ;
     movf Bl,w ;
     addwfc T8l,f ;
     movf Bh,w ;
     addwfc T8h,f ;
     bra dol
pol
     movf Al,w ;
     subwf T6l,f ;
     movf Ah,w ;
     subwfb T6h,f ;
     movf Bl,w ;
     subwfb T8l,f ;
     movf Bh,w ;
     subwfb T8h,f ;

dol bcf STATUS,C ;
     rlcf Al ;
     rlcf Ah ;
     rlcf Bl ;
     movlw b'11111000' ;
     andwf Al ;
     movlw b'00000101' ;
     iorwf Al ;

     btfss T8h, 7 ;
     bra per ;
     movlw .2 ;
     subwf Al ;
     per decfsz Cl,f ;
     bra go34 ;
     bcf STATUS,C ;
     rrcf Bl ;

     rrcf Ah ;
     rrcf Al ;
     bcf STATUS,C ;
     rrcf Bl ;
     rrcf Ah ;
     rrcf Al ;
     return ;
; Sqrt16(ARGA1:ARGA0) = RES0

Sqrt16 clrf TEMP0 ; clear the temp solution
     movlw 0x80 ; setup the first bit
     movwf BITLOC0
     movwf RES0

Square8 movf RES0, W ;
     movf PRODL, W ; ARGA - PROD test
     subwf ARGA0, W
     movf PRODH, W
     subwfb ARGA1, W

     btfsc STATUS, C
     bra NextBit ;

     movff TEMP0, RES0 ;
     rrncf BITLOC0, F ;
     movf BITLOC0, W ; back into RES0
     iorwf RES0, F

     btfsc BITLOC0, 7 ;
     bra Done ; out
     bra Square8 ; elso go back for another test

NextBit movff RES0, TEMP0 ;
     rrncf BITLOC0, F ;
     movf BITLOC0, W
     iorwf RES0, F

     btfsc BITLOC0, 7 ;
     bra Done ; out
     bra Square8

Done movff TEMP0,RES0 ;
     return

; Квадратный Корень 32 бита
; Sqrt32(ARGA3:ARGA2:ARGA1:ARGA0) = RES1:RES0

Sqrt32 clrf TEMP0 ; clear the temp solution
     clrf TEMP1
     clrf BITLOC0 ; setup the first bit
     clrf RES0
     movlw 0x80
     movwf BITLOC1 ; BitLoc = 0x8000
     movwf RES1 ; RES = 0x8000

Squar16 movff RES0, ARG1L ;
     call Sq16

     movf SQRES0, W ; ARGA - PROD test
     subwf ARGA0, W
     movf SQRES1, W
     subwfb ARGA1, W
     movf SQRES2, W
     subwfb ARGA2, W
     movf SQRES3, W
     subwfb ARGA3, W

     btfsc STATUS, C
     bra NxtBt16 ;

     addlw 0x00 ; clear carry
     movff TEMP0, RES0 ;
     movff TEMP1, RES1

     rrcf BITLOC1, F ; then rotote the bit and put it
     rrcf BITLOC0, F
     movf BITLOC1, W ; back into RES1:RES0
     iorwf RES1, F
     movf BITLOC0, W
     iorwf RES0, F

     btfsc STATUS, C ;
     bra Done32 ; out
     bra Squar16 ; elso go back for another test

     NxtBt16 addlw 0x00 ; clear carry
     movff RES0, TEMP0 ;
     movff RES1, TEMP1

     rrcf BITLOC1, F ;
     rrcf BITLOC0, F
     movf BITLOC1, W ;
     iorwf RES1, F
     movf BITLOC0, W
     iorwf RES0, F

     btfsc STATUS, C ;
     bra Done32 ; out
     bra Squar16

Done32 movff TEMP0,RES0 ;
     movff TEMP1,RES1
     return

;16 X 16 Unsigned Square
; SQRES3:SQRES0 = ARG1H:ARG1L ^2


     Sq16 movf ARG1L, W
     mulwf ARG1L ;
     movff PRODH, SQRES1 ;
     movff PRODL, SQRES0 ;

     movf ARG1H, W
     mulwf ARG1H ;
     movff PRODH, SQRES3 ;
     movff PRODL, SQRES2 ;

     movf ARG1L, W
     mulwf ARG1H ;
     movf PRODL, W ;
     addwf SQRES1, F ; Add cross
     movf PRODH, W ; products
     addwfc SQRES2, F ;
     clrf WREG ;
     addwfc SQRES3, F ;

     movf ARG1H, W ;
     mulwf ARG1L ;
     movf PRODL, W ;
     addwf SQRES1, F ; Add cross
     movf PRODH, W ; products
     addwfc SQRES2, F ;
     clrf WREG, W ;
     addwfc SQRES3, F ;

     return


Загрузи файлы в формате .asm

CHSqrt.asm Sqrt_Microchip.asm



Для получения дополнительной информации используйте:

MAGETEX
Ukraine
Телефон: +380-50-575-98-63
Факс: +380-50-575-98-63
Интернет: invent-systems@ya.ru
 

Главная | Назад
 
Отправить сообщение для: gchernov@mail.ru с вопросами и замечаниями об этом веб-узле.
© 2007 MAGETEX
Дата изменения: 23.08.2013