
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo Joe, a) das Pogramm sollte sehr schnell sein, da nur wenige Subtraktionen... b) > '! MOV #64,ASMB1d > '! MOV #66,ASMB1c '! MOV #15,ASMB1b ! MOV #0,ASMB1a aus Deinem Programm herausnehmen, habe dies ja nur als Beispiel genutzt c) bei "NOP" ist die Berechnung beendet. Du mußt hier also herausspringen in das BASIC-Programm. Statt "NOP" z.B. "RTS" Das Resultat steckt dann in in Res1a und Res1b und kann mit BASIC ausgegeben werden. Guten Rutsch (bringe es auf jedem Fall in der 2. Januarhälfte auf die OM und schicke es Dietmar) > 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 |