Hallo !! Vorab erstmal, ich bin (absoluter) Assembler-Anfänger ;) Aber ich hab mal ein mehr oder weniger kleines Programm geschrieben, dass eigentlich im Simulator auch so funktioniert wie ich das will. Nur hab ich dann eine Programmzeile hinzugefügt, die mir vollkommen unerklärlich eine Fehlermeldung verursacht. Wär nett, wenn sich den mitgeschickten Code mal jemand ansehen könnte. genauer: Wenn der Befehl in Zeile 84 (ldi erg, 0x00) nicht einkommentiert ist, regt sich der Compiler auf, dass irgendetwas mit dem dem Befehl (breq main) in Zeile 238 nicht passt ! Könnte mir jemand sagen, was daran falsch ist und mit danach vielleicht auch sagen, warum das so falsch ist? Aja, die Tab-Stops, Abstände, ... sehen in AVRStudio viel schöner aus als in einem normalen Text-Editor - sorry ! Danke ! mfG Alexander
ich denke mal das die relative sprungweite nicht mehr ausreicht. für breq main in zeile 238 ist main zu weit weg. Um einen rel. sprung kann nur -128 und +127 adressen gesprungen werden. umbauen oder direkten sprung benutzen Reiner
Hallo! Warum der da einen Fehler macht weis ich auch nicht, da ich mich auch erst ein paar Wochen mit Assembler beschäftige. Anscheinend gibt es irgendeine festgelegte Reichweite für solche Sprünge. Es ist nämlich egal was man für eine Zeile dort hinzuschreibt, es kommt immer der Fehler. Wenn du das Programm aber so umschreibst sollte es funktionieren: in4_f: cbr erg, 0x08 ; Eingabe 4 als ... cpi temp, 0x20 ; "Reset" gedrückt? brne check ; nein: check rjmp main ; ja : zurück Gruß Matthias
mhmm .... DANKE ! das scheint es echt zu sein: weil wenn ich diesen Befehl (ldi erg, 0x00) wieder in den programmcode aufnehm und dafür einen anderen befehl auskomentier funktioniert es. Aber: Weiter unten im programmcode stehen auch noch einige "rjmp main" und bei denen meldet der Compiler nichts. oder wird einfach nicht weitercompiliert wenn ein Fehler aufgetreten ist ?? mfG Alexander
Lieber Alexander, ein Blick ins instruction manual wird die Wahrheit über "rjmp" offenbaren. Oliver
Hallo !!! Tschuldigung, dass ich mich jetzt erst wieder meld - konnte die letzen Tage nicht ins Netz! Also, ich hab mir die Befehle "rjmp", "jmp" und verschiedene "branch if..." im Instruction Set mal genauer angeschaut. Das mit Sprungweiter muß anscheinend echt berücksichtigt werden. Allerings hab ich doch noch ein paar Fragen dazu: .) woher weiß ich wärend dem Programmieren, wie weit dieser Sprung genau geht? weil nur so kann ich entscheiden ob ich "rjmp" oder "jmp" verwenden muß. .) hat "jmp" irgendwelche Nachteile gegenüber "rjmp" - außer, dass "jmp" um 1 Takt länger braucht beim Abarbeiten? mfG Alexander
Hi Alexander, ich kann jetzt leider nicht effektiv zur Lösung beitragen, da ich mit Avr-Gcc in C programmier, aber welche Simulationsumgebung benutzt du? Ich verwende Visual Micro Lab zum simulieren , und die ist wirklich genial... Vielleicht kannst du mit den Meldungen mehr anfangen. Ich denke das dort dein Sprungproblem rechzeitig erkannt wird. Die haben auch eine 21Tage Full Featured Testversion Homepage: http://www.amtools.net Viel Spass Andi
Hallo, jmp hat gegenüber rjmp den nachteil, das absolute adressen verwendet werden. Das stört eigentlich wenig. Normalerweise benutzt man sowieso immer labels als Sprungziel und der assembler paßt das dann an. Wenn man aber nur relativ springt, dann könnte man auch die Binärdatei ohne probleme in einem anderen Speicherbereich laufen lassen. Das kann nützlich sein wenn man innerhalb einer Controllerfamilie unterschiedliche Controller verwendet, die Ihren Speicher an andere Adressen haben. Eckhard
Vielen Dank für euren vielen Antworten !! Echt super Forum hier !! mfG Alexander
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.