Mit Sprungmarke in Assembler rechnen

Gast #421768
Lesenswert?

Ich versuche ein Assembler Programm mit einer Sprungtabelle als
Assemblerprogramm in ein C Programm (AVR GCC 4.1.1) einzubinden.
Im orginalen Programm in AVR Studio Assembler funktionierte das:

subi ZL, low(-comp)
sbci ZH, high(-comp)

comp ist eine Sprungmarke ein paar Zeilen weiter unten in derselben
Funktion.

Das ganze habe ich schon an den GCC Assembler angepasst:

subi ZL, lo8(-comp)
sbci ZH, hi8(-comp)

aber anscheinend kann das der Assembler nicht auswerten:

tvgen.S:40: Error: can't resolve `L0' {*ABS* section} - `com {.text
section}
tvgen.S:40: Error: expression too complex
tvgen.S:41: Error: can't resolve `L0' {*ABS* section} - `com'
{.text section}
tvgen.S:41: Error: expression too complex

Ohne das - vor comp funktioniert das ganze (was aber eben ein falsches
Ergebnis liefert).

Als workaround könnte ich comp über ldi erst in Register laden und dann
aufaddieren, aber wiso soll ich Rechenzeit und Register für Operationen
verschwenden die schon zu Compilezeit feststehen ?
Gast #421771
Lesenswert?

Die Klammern bringen leider überhaupt nichts, das war das erste was ich
ausprobiert hatte. Auch das Makro pm() funktioniert nicht. (Dieses
scheint den Wert nur durch 2 zu teilen, da die Sprungmarken
Byteadressen sind, IJMP aber Wordadressen braucht.
Gast #421773
Lesenswert?

In Zeile 47&48 auskommentiert.
Ich habe dieses vorübergehend durch den Code in Zeilen 39-45 ersetzt.
Das Ergebnis ist das selbe, nur dass ich das ganze jetzt zur Laufzeit
berechne, was mir nicht wirklich gefällt.
Angehängte Dateien:

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