Forum: Mikrocontroller und Digitale Elektronik Avr(-GCC) Assembler: rjmp macht nicht das was es soll


von phanaton (Gast)


Lesenswert?

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
von phanaton (Gast)


Lesenswert?

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
von Stefan E. (sternst)


Lesenswert?

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".
von Uwe B. (derexponent)


Lesenswert?

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
von phanaton (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.