Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Quadratwurzel von 32 Bit Zahl Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe - 28.12.2014 14:48)
 Als Antwort auf Re: Quadratwurzel von 32 Bit Zahl von GeKue - 23.12.2014 20:10
Joe nutzt:  CC1-M-Unit V1.1, Open-Micro, Open-Macro
Hallo GeKue,

heute kam ist erst dazu Dein Prog.-Listing in Inline Assembler anzu passen. Leider bleibt das Programm bei der Ausfuehrung im Assemblerteil haengen und liefert kein Ergebnis. Wo es da haengen bleibt, kann ich mit meinem beschraenkten Assemblerkenntnissen leider nicht herausfinden.

Braucht ein Programm auf der Grundlage des schriftlichen Wurzelziehens mehr Rechenzeit als mit einem Algorithmus entsprechend dem elm-chan - Programm?

Auf dieser Seite http://www.piclist.com/techref/microchip/math/sqrt/sqrt32.htm
habe ich auch ein Listing für die PIC Microcontroller gefunden.
In dieser Beschreibung http://ww1.microchip.com/downloads/en/AppNotes/91040a.pdf
ist recht gut dargestellt, wie es gemacht wird.

Viele Grüsse

Joe

########### in Inline Ass umgesetztes P-Listing #########

' 32B_GEKU.BAS  Test Quadratwurzel nach Vorschlag von GeKue So. 28.12.2014
' Umfang: 272 Basic Bytes; 0 Sys-Bytes; 10  RAM-Bytes
' assembler befehl asl wird nicht in gleicher farbe angezeigt,
' wie alle anderen assembler befehle;
' in zusatztestprogramm habe ich das aber getestet, da wurde befehl ausgefuehrt

' 32B_GEKU.BAS bleibt im assembler bereich haengen und liefert kein ergebnis
' --- Betriebssystem konfigurieren ------------------------------------------
INCLUDE "OMAC.DEF"           'Include-Datei mit Definitionen vom April 2010
' ---------------------------------------------------------------------------
' --- Definitionen Variable fuer das Hauptprogramm
' ----Def. LONGD Variable umfasst 4 Bytes fuer 32 Bit-----------------------
DEFINE Asmb   AS LONG  '32 Bit Eingabe Wert
DEFINE Asmb1a AS BYTE[4] OF Asmb  'Eingabe MSB; hoeherwertigrs Byte der  
DEFINE Asmb1b AS BYTE[3] OF Asmb  ' 32 Bit Zahl
DEFINE Asmb1c AS BYTE[2] OF Asmb  '  
DEFINE Asmb1d AS BYTE[1] OF Asmb  '

DEFINE Sub1a1  BYTE   ' 32Bit Rechenbereich 1= wa
DEFINE Sub1a   BYTE
DEFINE Sub1b   BYTE
DEFINE Res1a1  BYTE
DEFINE Res1a   BYTE   ' Ergebnis
DEFINE Res1b   BYTE   ' Ergebnis

'            ASMB1a: DC.B 1           'hier steckt die 32-Bit-zahl drin
'            ASMB1b: DC.B 1
'            ASMB1c: DC.B 1
'            ASMB1d: DC.B 1
'            Sub1a1: DC.B 1
'            Sub1a:  DC.B 1
'            Sub1b:  DC.B 1
'            Res1a1: DC.B 1
'            Res1a:  DC.B 1            ' in Res1a und Res1b
'            Res1b:  DC.B 1            ' wird das Ergebnis ausgegeben


' Hauptprogramm-----------------------------------------------
' --- Beispiel: Quadrat Wurzel
Asmb1a=&h00     ' Eingabewerte
Asmb1b=&h0F     ' 1 000 000 in Hex = =F 42 40 = dez 15  66  64
Asmb1c=&h42
Asmb1d=&h40
PRINT  "SQRT_Ber =h0f4240==1 000 000"
PRINTHEX=ON
PRINT Asmb1a,Asmb1b,Asmb1c,Asmb1d
PRINTHEX=OFF
PRINT "SQRT_Erg"
sqrt_32
PRINTHEX=ON
PRINT Res1a, Res1b
PRINTHEX=OFF

END
' Subroutine//Procedure fuer Wurzel//Square root aus 32-Bit Zahl
' ----------------------------------------------------------------------------:
PROC sqrt_32 INLASM
'            ; Hier die 32-Bitzahl eintragen und notwendige Startwerte vergeben
'! MOV  #64,ASMB1d  ' hier statt Null x-beliebige Werte vergeben
'! MOV  #66,ASMB1c  ' aus denen die Wurzel gezogen werden soll
'! MOV  #15,ASMB1b
'! MOV  #0,ASMB1a  ' hoeherwertiges Byte des 32-Bit-Wertes
! MOV  #1,Res1b   ' Startwert muss auf 1 gesetzt werden
! MOV  #0,Res1a
! MOV  #0,Res1a1  
! MOV  #0,Sub1b
! MOV  #0,Sub1a
! MOV  #0,Sub1a1  
! LDX  #16        'Schleifenzaehler muss auf 16 stehen
' Suchen des ZahlenAnfangs durch Links-Schieben          
#Find_Start
! JSR Schieb
! DECX
! LDA Sub1b
! CBEQA #0,Find_Start            
' StartWert
! SUB #1     'Erste Differenz nach A
! STA Sub1b  'Differenz in Sub1b
#Loop        ' rechnet zu Fuss mit binomischer Formel  
! JSR Schieb ' Zwei Bits herunterholen und nach Sub1 schieben        
! ASL Res1b  ' Subtrahent mit 4
! ROL Res1a  ' multiplizieren
! ROL Res1a1
! SEC        ' und mit 1 erweitern
! ROL Res1b
! ROL Res1a
! ROL Res1a1
! PSHX       ' X retten = Schiebezähler
! LDHX Res1a1
! CPHX Sub1a1
! BHI NoSubtrak  ' wenn Res1a>als Subtrak
! BEQ NewTest    ' wenn beide Werte gleich, neu testen
#Subtrak
! LDA Sub1a1     ' Subtraktion Sub1-Res1 - Ergebnis nach Sub1
! SUB Res1a1
! STA Sub1a1
! LDA Sub1a      
! SBC Res1a
! STA Sub1a
! LDA Sub1b
! SBC Res1b
! STA Sub1b
! BSET 1,Res1b    '1 als neue Ziffer setzen
#NoSubtrak
! LSR Res1a1      ' Result regenerieren
! ROR Res1a
! ROR Res1b
! PULX
! DBNZX Loop
! NOP             ' jetzt steht das Ergebnis in Res1a und Res1b          
#NewTest
! LDA Res1b
! CMP Sub1b
! BHI NoSubtrak
! BRA Subtrak
#Schieb
! JSR Schieb1
#Schieb1
! ASL ASMB1d
! ROL ASMB1c
! ROL ASMB1b
! ROL ASMB1a
! ROL Sub1b
! ROL Sub1a
! ROL Sub1a1
! RTS
END PROC

' ---------------------------------------------------------------------------

INCLUDE "OM_FW.PRO"

 Antwort schreiben

Bisherige Antworten:

Re: Quadratwurzel von 32 Bit Zahl (von GeKue - 30.12.2014 19:47)
    Re: Quadratwurzel von 32 Bit Zahl (von Joe - 31.12.2014 17:46)
        Re: Quadratwurzel von 32 Bit Zahl (von GeKue - 7.01.2015 15:15)
            Re: Quadratwurzel von 32 Bit Zahl (von Joe - 9.01.2015 9:53)
                Re: Quadratwurzel von 32 Bit Zahl (von GeKue - 29.01.2015 12:39)
                    Re: Quadratwurzel von 32 Bit Zahl (von Joe - 31.01.2015 15:35)
                       Re: Quadratwurzel von 32 Bit Zahl (von Joe - 2.04.2015 16:35)