- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 65

Thema: Bascom Inline-Assembler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hallo,

    habe mir gerade das AVR-Studio 4 runtergeladen und mir den Disassemblierten Code angesehen.
    Code:
    1202:       Empf(channel) = Timer0
    
    +00001D0E:   E4A6        LDI       R26,0x46       Load immediate
    +00001D0F:   E0B0        LDI       R27,0x00       Load immediate
    +00001D10:   918C        LD        R24,X          Load indirect
    +00001D11:   E3AF        LDI       R26,0x3F       Load immediate
    +00001D12:   E0B3        LDI       R27,0x03       Load immediate
    +00001D13:   90AD        LD        R10,X+         Load indirect and postincrement
    +00001D14:   24BB        CLR       R11            Clear Register
    +00001D15:   E1A5        LDI       R26,0x15       Load immediate
    +00001D16:   E0B3        LDI       R27,0x03       Load immediate
    +00001D17:   0CAA        LSL       R10            Logical Shift Left
    +00001D18:   1CBB        ROL       R11            Rotate Left Through Carry
    +00001D19:   0DAA        ADD       R26,R10        Add without carry
    +00001D1A:   1DBB        ADC       R27,R11        Add with carry
    +00001D1B:   938D        ST        X+,R24         Store indirect and postincrement
    +00001D1C:   2788        CLR       R24            Clear Register
    +00001D1D:   938C        ST        X,R24          Store indirect
    Manches verstehe ich aber nicht. Warum wird z.b. R26 und R27 dreimal mit einem Wert beschrieben, wenn die Register nach den ersten beiden Malen gar nicht verwendet werden und wieder überschrieben werden? Außerdem wird R11 erst gelöscht und dann um 1 nach links geschoben. Was hat das für einen Sinn?
    Ich hoffe, ich stelle mich jetzt nicht zu blöd an und jemand ist bereit, mir das zu erklären?

    Gruß & Vielen Dank
    Ghris

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Denk dran', "X" und R26 / R27 ist das Gleiche !

    Um das Register R24 mit einem Wert aus einer SRAM -Variablen zu laden, muss man --> :
    Code:
      LDI    R26 , LOW (Variable)   
      LDI    R27 , HIGH (Variable)   
      LD     R24 , X                 X ==  Registerpaar XL /XH und das ist identisch mit  R26/R27
    AVR ASM hat drei solcher Pointer-Register
    X == XL/XH == R26/R27
    Y == YL/YH == R28/R29
    Z == ZL/ZH == R30/R31

    und für die gibt es die BEfehle
    LD reg , X
    LD reg , Y
    LD reg , Z
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Chris.
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Außerdem wird R11 erst gelöscht und dann um 1 nach links geschoben. Was hat das für einen Sinn?
    XL & XH wurde Dir ja bereits von PicNick erklärt. Wobei mir allerdings der Nutzen im gezeigten Code nicht recht klar wird, denn wenn keine variable Adressierung notwendig ist, so verbraucht die Kombination
    Code:
    LDI   XL,   lbyte(Sram_Adress)
    LDI   XH,   hbyte(Sram_Adress)
    LD    Rxx,  X
    deutlich mehr Flash als ein simples
    Code:
    LDS   Rxx,   {Sram_Adress}
    Außerdem wird R11 erst gelöscht und dann um 1 nach links geschoben. Was hat das für einen Sinn?
    Das dient zum Übertrag des Carry-Flags, hier in's High-Byte des 16Bit Wertes, mache ich auch so im von mir geposteten Beispielcode, nur dort mit ADD/ADC.
    Du könntest keine Additionen oder Schiebeoperationen größer 8Bit ohne Carry durchführen.

    Hast Du eigentlich die Bascom-Kommentare aus dem AVR-Studio Listing gezielt entfernt, oder nur das falsche File geladen ?

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Bascom ist nicht der allergrösste Optimierer. Wenn die Zielvariable ("Empf") ein Word ist, verwendet Bascom eigentlich generell die
    LD XL, lbyte ( ..)
    LD XH, hbyte( ..)
    sequenz, auch wenn das im Einzelfall gar nicht notwendig wäre

    Btw: Wenn man Assembler schreibt, sollte man sich auch von der BAscom-od. "höhere-Sprache" Denkweise lösen. z.B
    Du füllst ja die "Empf" Tabelle strikt aufsteigend. Also ist das Verwenden eines Index überflüssige Arbeit für den µC.
    aber das ist jetzt vielleicht zuviel über-drüber für deine Fragestellung
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von PicNick Beitrag anzeigen
    Bascom ist nicht der allergrösste Optimierer.
    Trifft hier zumindest was den Speicherverbrauch betrifft nicht zu.
    Wenn die Zielvariable ("Empf") ein Word ist, verwendet Bascom eigentlich generell die
    LD XL, lbyte ( ..)
    LD XH, hbyte( ..)
    sequenz, auch wenn das im Einzelfall gar nicht notwendig wäre
    Vom Flashverbrauch her macht's keinen Unterschied, es sind nur mehr Zyklen, ich denke wir sprechen hier über Speicherverbrauch.
    Code:
    LDS   Rxx,   {Word_Var_Adr_LB}   <-- 4 Bytes, 1 Zyklus
    LDS   Ryy,   {Word_Var_Adr_HB}   <-- 4 Bytes, 1 Zyklus
    ' 8 Bytes, 2 Zyklen
    Code:
    LDI   XL,   lbyte(Word_Var_Adr_LB)   <-- 2 Bytes, 1 Zyklus
    LDI   XH,   hbyte(Word_Var_Adr_LB)   <-- 2 Bytes, 1 Zyklus
    LD   Rxx,   X+                       <-- 2 Bytes, 2 Zyklen
    LD   Ryy,   X                        <-- 2 Bytes, 1 Zyklus
    ' 8 Bytes, 5 Zyklen
    Ansonsten wär's interessant, woraus das von Chris gezeigte Assemblerlisting erzeugt wurde, meine Version 2.0.7.3 baut aus:
    Code:
    Dim A As Byte , B As Byte
    B = A
    das hier:
    Code:
    9:        B = A 
    LDS       R24,0x0060
    9:        B = A 
    STS       0x0061,R24
    Egal ob mit oder ohne eingeschaltete Optimierung, und das ist einwandfrei so.

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Bei Byte = BYte ist es so, wie du sagst

    aaaber
    Beispiel :
    Code:
    Dim A As Byte
    Dim B As Byte
    Dim C As Word
    
       B = 165
       A = B
       C = B
    End
    Was wird draus:
    Code:
     
       B = 165
    
     LDI r24,0xA5
     STS 0x0061,r24   'ok, besser geht's nicht
    
       A = B
     LDS r24,0x0061
     STS 0x0060,r24  'ok, ebenfalls     das entspricht deinem Beispiel 
    
    aber jetzt     WORD = BYTE -------------------
    
       C = B
    
     LDI XL,0x61
     LDI XH,0x00
     LD r24,X            jetzt lädt er "B" nicht mehr mit LDS, sondern über X
    
     LDI XL,0x62      ' das Word-speichern ist wohl ok, wenn man nicht erbsen zählt 
     LDI XH,0x00
     ST X+,r24
     CLR r24
     ST X,r24
    
    
    -------- er hätte schreiben können 
      STS 0x0062,r24  
      CLR r24
       STS 0x0063,r24
    Geändert von PicNick (22.12.2011 um 10:22 Uhr)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von PicNick Beitrag anzeigen
    Code:
      LDI XL,0x61
     LDI XH,0x00
     LD r24,X            jetzt lädt er "B" nicht mehr mit LDS, sondern über X
    Ja, ist jetzt nicht direkt logisch, da dazu keine Notwendigkeit besteht.

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich kann ja nur vermuten. Bascom macht ja ein implizites "Casting" auf die Zielvariable (word), d.h. er wählt zum Registerladen die "X" -Methode.
    dann hätt man aber erwarten können
    Code:
     LDI XL,0x61
     LDI XH,0x00
     LD   r24,X            
     CLR R25
    ' ab nun wäre "B" ein gecastetes WORD (R24/R25), und Bascom müsste sich nicht mehr drum kümmern.
    Das geschieht aber auch wieder nicht. Er muss jedesmal doch wieder dran denken, dass "B" eigentlich nur ein Byte ist

    Nun, was soll's
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Ähnliche Themen

  1. Inline Assembler
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 01.02.2010, 19:25
  2. AVR GCC inline Assembler
    Von chientech im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 26.09.2009, 16:39
  3. Inline Assembler für Anfänger
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 25.10.2007, 19:53
  4. Inline Assembler - Register
    Von s.o. im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 02.08.2007, 20:26
  5. Parameterübergabe bei Inline-Assembler
    Von ogni42 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 30.03.2006, 13:32

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress