mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Unter diesem Link seh' ich aber nix zum absoluten Adressieren von Arrays, Loadadr kommt zwar vor, wird aber zur sequentiellen Adressierung benutzt, einmal bei Strings und einmal um ein Word zu holen.
Der Trick bei der absoluten Adressierung ist dagegen, sich die Basisadresse zu holen und den Index aufzuaddieren. Da im vorliegenden Beispiel der Code in einer ISR ausgeführt wird, muss der Index immer wieder neu geholt werden, sequentielle Adressierung ist nicht brauchbar.
Hallo,
danke, das hilft mir schon mal sehr weiter
ABER:
Wie lade ich denn den Wert wieder ins Array? Im Endeffekt möchte ich folgendes nach ASM umsetzen:
Außerdem ist zu beachten, dass Empf() ein Word ist, aber ich denke, das macht nichts!?Code:Dim Empf(5) As Word Dim Channel As Byte ... ISR: Empf(channel) = Timer0
Sorry, für meine etwas blöden Fragen, aber ich habe noch nicht viel in ASM gemacht, außer ein paar If-Abfragen und Blink-Programme - ausschließlich mit Byte-Datentypen.
Gruß
Chris
Mit dem Gegenpart des "LD"-Befehls, dem "ST"-Befehl, das wiederum ist im Tutorial zu finden.
Sinnvollerweise mit postincrement, da wird der X,Y oder Z-Pointer nach Ausführung um 1 erhöht.
"Macht nichts" ist der falsche Ausdruck, natürlich muss darauf reagiert werden, die X,Y & Z-Pointerei ist Byte-orientiert, damit entspricht WordArr(3) dem 5. & 6. Byte. Du musst also den Index, bevor Du ihn zur Basisadresse addierst, mal 2 nehmen. Am schnellsten geht's, wenn Du ihn einmal nach links schiebst, das geht mit LSL für das LB und ROL für das HB.dass Empf() ein Word ist, aber ich denke, das macht nichts!?
Wenn Dein Array nur 5 Elemente groß ist, kannst Du Dir sparen das HB zu schieben, da immer 0.
Das entspräche dann dem hier:
Würde Dir raten, Du holst Dir das AVR-Studio 4, dort kannst Du die von Bascom erzeugte .obj-Datei laden und Dir den disassemblierten Code ansehen. Indem Du Dir einfache Beispiele in Basic schreibst, kannst Du daraus lernen wie Bascom das umsetzt.Code:!LDS R18, {ArrPtr} !DEC R18 <--- weglassen bei Index 0-4 !CLR R19 !LSL R18 !ADD ZL, R18 !ADC ZH, R19 !ST Z+, Reg(WordVal_LB) !ST Z, Reg(WordVal_HB)
Hallo,
habe mir gerade das AVR-Studio 4 runtergeladen und mir den Disassemblierten Code angesehen.
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?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
Ich hoffe, ich stelle mich jetzt nicht zu blöd an und jemand ist bereit, mir das zu erklären?
Gruß & Vielen Dank
Ghris
Denk dran', "X" und R26 / R27 ist das Gleiche !
Um das Register R24 mit einem Wert aus einer SRAM -Variablen zu laden, muss man --> :
AVR ASM hat drei solcher Pointer-RegisterCode:LDI R26 , LOW (Variable) LDI R27 , HIGH (Variable) LD R24 , X X == Registerpaar XL /XH und das ist identisch mit R26/R27
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.
Chris.
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
deutlich mehr Flash als ein simplesCode:LDI XL, lbyte(Sram_Adress) LDI XH, hbyte(Sram_Adress) LD Rxx, X
Code:LDS Rxx, {Sram_Adress}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.Außerdem wird R11 erst gelöscht und dann um 1 nach links geschoben. Was hat das für einen Sinn?
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 ?
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.
Lesezeichen