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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.