Hi, Ich will rjmp so nutzen, daß ich nicht unnötige Sprungmarken festlegen muss, das ganze, nicht aus Faulheit(aus einem anderen Betrachtungswinkel vieleicht schon ;) ), sondern als eine Art inline Funktion(per #define), und da würden die Sprungmarken stören weil durch Wiederverwendung der Funktion mehrere gleichnamige Sprungmarken angelegt würden. Da ich aus dem Avr Instructionset entnommen habe, das rjmp k == PC+k+1 ist, und ich erreichen will der PC um zwei Einheiten zurückgestellt werden soll, habe ich mir folgendes gedacht: rjmp -3 Nun kommt der Compiler mit folgendem Fehler: Error: odd address operand: -41 Nur aus Interesse habe ich einfach weitere Konstanten eingegeben mit sehr merkwürdigen Ergebnissen, die nach meiner Meinung keinen Zusammenhang ergeben. So dann also z.B. rjmp -2 ergibt(da der Compiler es merkwürdigerweise annimmt) im Disassembler: 63: rjmp -2 +000005F9: CFEB RJMP PC-0x0014 Relative jump Kann sich das einer(oder mir) erklären? Ich danke schon mal... Gruß Philipp
Ich hab jetzt die Lösung gefunden, nach durchforsten vom .lss File, man muss vor die Zahl (die unter anderem in Byte-Adressen dann angegeben ist) einen Punkt setzen, in meinem Fall wäre das dann: rjmp .-6
phanaton schrieb: > sondern als eine Art inline Funktion(per #define), > und da würden die Sprungmarken stören weil durch Wiederverwendung der > Funktion mehrere gleichnamige Sprungmarken angelegt würden. Ist nicht wirklich ein Argument. Der gas kann auch wunderbar mit lokalen Marken umgehen. Und warum eigentlich per #define, und nicht gleich richtige Assembler-Makros? phanaton schrieb: > rjmp -3 Der gas erwartet eine Angabe in Bytes, der Programmspeicher ist aber in Words organisiert, also machen hier ungerade Werte keinen Sinn. phanaton schrieb: > rjmp -2 > ergibt(da der Compiler es merkwürdigerweise annimmt) im Disassembler: > > 63: rjmp -2 > +000005F9: CFEB RJMP PC-0x0014 Relative jump Das -2 dürfte wohl als absolute Adresse aufgefasst werden. Richtig wäre: "rjmp .-2".
Hi Philipp, versuch mal :
1 | rjmp PC - 2 |
aber das kann sehr schnell übel in die Hose gehen, wenn du mitten in einem Befehl "reinspringst" ist ja aber dann "dein Bier" :-) Gruss Uwe
Ok, An Assembler-Makros hab ich gar nicht gedacht(bzw. noch nicht mal wirklich davon gehört, schau ich mir gleich mal an ;) ) Ansonsten vielen Dank für die Hilfe(auch wenn ichs kurz vor deinem Post rausgefunden habe, warst wahrscheinlich noch am tippen) @Uwe: Das hab ich leider schon ohne Erfolg ausprobiert, der Compiler kennt PC nicht... Gruß und Dank Philipp
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.