[an error occurred while processing this directive]
Про книги
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено Looker 16 июля 2002 г. 18:29
В ответ на: На асме есть в книжице "MSP430 Family Software User's Guide", наверное и на сайте имеется. отправлено Shura 16 июля 2002 г. 15:30

Вот и передо мною (рекомендую всем, особенно вторую):


MSP430 Family - Software User Guide
...
5 General Purpose Subroutines (5_purpos.pdf на диске MSP340)
5.11 Square Root


MSP430 Family - Metering Application Report
Lutz Bierl
Version 3.0
April 1997
...
5 Software Application
5.1 Integer Calculation Subroutines
5.1.7 Square Root


где пара страниц там и там аки пояснения и ассемблерный листинг одинаковы и таковы:


The square root is often needed in computations. The following subroutine uses the NEWTONIAN approximation for this calculation. The number of iterations depends on the length of the operand. The general formula is:

m /~~
~\/ A = X
Xn+1=1/m{(m-1)*Xn+A/Xn^(m-1)

With the substitution of m=2 it follows:

\/~A=X
Xn+1=(1/2)*{Xn+A/Xn}
Xo=A/2

To calculate A/Xn a division is necessary, which is done in the subroutine XDIV. The result of this division has the same integer format as the divisor Xn. This makes an easy operation possible.

AH .EQU R8 ;HIGH WORD OF A
AL .EQU R9 ;LOW WORD OF A
XNH .EQU R10 ;HIGH WORD OF RESULT
XNL .EQU R11 ;LOW WORD OF RESULT

;THE RANGE FOR THE OPERAND EXTENDS FROM 0000.0002H TO 7FFF.FFFFH
;INPUT: OPERAND IN AH.AL
;OUTPUT: RESULT IN XNH.XNL
;EXAMPLE: SQR(2)=1.6A09H
; SQR(7FFF.FFFFH) = B5.04F3H
; SQR(0000.0002H) = 0.016AH

SQR
MOV AH,XNH ;SET X0 TO A/2 FOR THE FIRST
MOV AL,XNL ;APPROXIMATION
RRA XNH ;X0=A/2
RRC XNL
SQR_1
CALL #XDIV ;R12XR13=A/XN
ADD R13,XNL ;XN+1=XN+A/XN
ADDC R12,XNH
RRA XNH ;XN+1=1/2(XN+A/XN)
RRC XNL
CMP XNH,R12 ;IS HIGH WORD OF XN+1 = XN
JNE SQR_1 ;NO, ANOTHER APPROXIMATION
CMP XNL,R13 ;YES, IS LOW WORD OF XN+1 = XN
JNE SQR_1 ;NO, ANOTHER APPROXIMATION
SQR_3
RET ;YES, RESULT IS XNH.XNL

;*************************************************************
;EXTENDED UNSIGNED DIVISION
;R8|R9 / R10|R11 = R12|R13, REST IS R14|R15
;THIS DIVISION ROUTINE IS WRITTEN EXCLUSIVELY FOR THE SQUARE
;ROOT ROUTINE TO OPTIMIZE THE EXECUTION TIME FOR THE DIVISION
;OF A/XN.
;*************************************************************
XDIV
PUSH R8 ;SAVE OPERANDS ONTO THE STACK
PUSH R9
PUSH R10
PUSH R11
MOV #48,R7 ;ONLY 48 LOOPS ARE NECESSARY
CLR R15 ;CLEAR REST
CLR R14
CLR R12 ;CLEAR RESULT
CLR R13
L$361
RLA R9 ;SHIFT ONE BIT OF R8|R9 TO
;R14|R15
RLC R8
RLC R15
RLC R14
CMP R10,R14 ;IS SUBTRACTION NECESSARY?
JLO L$364 ;NO
JNE L$363 ;YES
CMP R11,R15 ;R11=R15
JLO L$364 ;NO
L$363
SUB R11,R15 ;YES, SUBTRACT
SUBC R10,R14
L$364
RLC R13 ;SHIFT RESULT TO R12|R13
RLC R12
DEC R7 ;ARE 48 LOOPS OVER ?
JNZ L$361 ;NO
POP R11 ;YES, RESTORE OPERANDS
POP R10
POP R9
POP R8
RET

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru