-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: If else in Assembler

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58

    If else in Assembler

    Anzeige

    Hi,

    wie setzte ich den Basic Code in Assembler um?
    Der Code sollte so schnell wie möglich ablaufen.

    Code:
     If G_erase = 1 Then                                       
       Gl_rstflag = 1
     Else
       Gl_rstflag = 0
     End If
    Danke

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Kommt sehr auf die Daten-Typen an (Byte , Word, etc.)
    schau dich da mal um:
    http://www.rn-wissen.de/index.php/As...ser#Verzweigen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Hi,

    Danke.

    das ist alles in Byte.

    So geht es. Ist sogar etwas schneller.
    Geht das vielleicht noch schneller?

    Code:
           $asm
              LDs R25, {G_erase}                                '
              LDI R24, 1                                        ' R24 = 1
    
              CP          R25, R24
              BREQ        Label_1                               ' Verzweigen nach "Ziel", wenn R25 = R24
    
              LDI         R22, 0                                ' das machen wir (zum Beispiel), wenn R25 NICHT= r24 ist
              RJMP        Label_2                               'wir müssen unbedingt springen, sonst laufen wir ja
    
            Label_1:
              LDI         R22, 1                                ' das machen wir (zum Beispiel), wenn R25 = r24 ist
    
            Label_2:
             sts {Gl_rstflag} , R22
    
         $end Asm

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das geht noch einiges schneller. Für den Vergleich mit Konstanten gibt es z.B. den Befehl CPI. Statt eine IF then else kann man es auch leich umschreiben auf nur eine Verzweigung, indem man erst ein register mit 0 läd, dann den Vergleich macht und ggf die 1 durch eine 0 ersetzt. Dann kann man den Registerinhalt zurückschreiben.
    Da hier nur ein Befehl über sprungen wird kann man auch statt dem Sprung ein Skipbefehl genutzt werden.
    Als Besonderheit gibt es dann noch den Befehl SPSE für ein ganz besonder kurze Lösung.
    Also etwa so:

    ldi R24 , 1
    lds R25, Variable1
    CPSE R24,R25
    ldi R24,0
    STS Varaible2, R24

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Cool danke.
    Das teste ich gleich mal.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Hi,

    super, nur diese eine Funktion macht fast 0,6% aus.
    Das hört sich nicht vielleicht nicht vile an, aber wenn ich alles austausche dann wird das GLCD immer schneller.
    Das Programm ansich ist mir egal wie lange das dauert, das bekokmme ich auch nicht mit. Ob die Temperaturberechung 0.01sec. schneller ist als vorher spielt ja kene Rolle bei einer Wetterstation.
    Aber die Anzeige sehe ich.

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Bei genauerer Betrachtung der Aufgabenstellung brauchst du gar kein "IF", sondern nur den "1"-er oder "0"-er von G-erase nach G_rstflag zu übertragen.

    Code:
          $asm 
              LDS R25, {G_erase}
              ANDI  R25, 1                  '  alles ausser 1 wegmaskieren
              STS {Gl_rstflag} , R25    
             '        that's it
         $end Asm
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Cool. Danke.
    Geht noch schneller.
    Bald habe ich gar keinen Code mehr.

    Noch ne Frage

    In Bascom gibt es den Befehl MOD.

    Ich habe z.B. die Funktion Mod8 verwendet.
    Ich habe das in dies hier verändert.
    Stimmt das so?
    Code:
    $asm
    lds R24, {Gl_x}
    Mod8:
        subi r24, 80
        brcs rest8
        subi r24, 80
        brpl sub8
    Rest8:
        subi r24, -80
    Sub8:
        subi r24, 8
        brpl sub8
        subi r24, -8
    Mod8_exit:
    LDI R25, 7
    !sub r25, r24
    
    sts {Gl_bit} , R25
    $end Asm

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wenn du den 8-er Rest brauchst,
    Code:
          $asm 
              LDS R25, {Gl_x} 
              ANDI  R25, 7                  '  alles ausser 0-7 wegmaskieren 
              STS {Gl_bit} , R25    
             '        that's it 
         $end Asm
    Bei Werten, die keine 2-er Potenzen sind, musst du allerdings meist wirklich durch die Gegend dividieren
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Version mit dem ANDI für das orignal Problem ist nicht zu 100% das gleiche wie der original BASIC Code. Wenn da z.B. der Wert 3 vorkommt, macht der original Code daraus eine 0 die Version mit dem ANDI eine 1. Es gibt aber Fälle wo es so geht.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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