Avr(-GCC) Assembler: rjmp macht nicht das was es soll

Gast #2431361
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
Gast #2431416
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
#2431421
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".
Gast #2431443
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren