Hi,
wie setzte ich den Basic Code in Assembler um?
Der Code sollte so schnell wie möglich ablaufen.
DankeCode:If G_erase = 1 Then Gl_rstflag = 1 Else Gl_rstflag = 0 End If
Hi,
wie setzte ich den Basic Code in Assembler um?
Der Code sollte so schnell wie möglich ablaufen.
DankeCode:If G_erase = 1 Then Gl_rstflag = 1 Else Gl_rstflag = 0 End If
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.
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
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
Cool danke.
Das teste ich gleich mal.
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.
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.
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
Wenn du den 8-er Rest brauchst,
Bei Werten, die keine 2-er Potenzen sind, musst du allerdings meist wirklich durch die Gegend dividierenCode:$asm LDS R25, {Gl_x} ANDI R25, 7 ' alles ausser 0-7 wegmaskieren STS {Gl_bit} , R25 ' that's it $end Asm
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
Lesezeichen