Forum: Compiler & IDEs Inline Assembler Problem


von Debugger (Gast)


Lesenswert?

Hallo Inline Experten,

ich möchte die Adresse einer Variable, welche in einem C Modul definiert 
ist, in das X Register eines AVR laden, wie geht dass, habe leider 
nichts gefunden.

Beispiel:

Modul Main.c

...

unisgned char bTest;

...

Assembler soll folgendes erledigen:
...
XH = &bTest(HIGH) ( wie geht dass Richtig ??? )
XL = &bTest(HIGH) ( wie geht dass Richtig ??? )
...


danke

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Beschreibe mal bitte dein komplettes Problem.  Beim inline-Assembler
zeigt es sich immer wieder, dass man schlecht Rat geben kann, wenn
man sich nur auf ein oder zwei Zeilen des Codes bezieht.

Ansonsten kannst du globale Symbole dort einfach so benennen.

von Debugger (Gast)


Lesenswert?

hallo, ok ich versuchs nochmal,

ich möchte ein altes Projekt von NEC nach AVR portieren, welches Teils 
in Assembler und Teils in C geschrieben ist.

Hierfür ist es nötig dass ich die Adresse einer in C definierten 
globalen Variable in die Pointerregister Xh und Xl (r26 und r27) lade.

irgendwo habe ich das gefunden:

asm volatile (""::"XL"(bTest)              );
asm volatile (""::"XH"(bTest+1)            );

wobei bTest eine globale Variable des Typs unsigned char ist.

dass obige funktioniert aber leider nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mach doch bitte trotzdem mal Nägel mit Köpfen, und schreib das
komplette Konstrukt auf, das du da übertragen willst.

Bist du dir sicher, dass der inline-Assembler überhaupt das beste
Mittel der Wahl ist?  Vielleicht wäre ja eine separate Assemblerdatei
viel besser?  Beim inline-Assembler muss man einfach sehr genau den
Compiler über die Details informieren, beispielsweise müsstest du in
diesem Falle r26 und r27 als `clobbers' anzeigen, damit der Compiler
weiß, dass er dieses Register ggf. neu laden (oder es einfach meiden)
muss.  U. U. wäre es aber viel praktischer, dem Compiler die maximale
Freiheit zu lassen und statt hart codierter XL/XH-Register einfach
per inline-asm-constraint zu verlangen, dass er einem einen Parameter
als Zeigerregister zur Verfügung stellt.  In diesem Falle hätte der
Compiler die Möglichkeit, das tatsächlich verwendete Zeigerregisterpaar
nach den übrigen Randbedingungen selbst zu wählen.

Verstehst du jetzt, warum ich nicht nur ein 2-Zeilen-Schnipsel sehen
möchte?

(Ach so, unter noch anderen Umständen könnte es sein, dass man das Ganze
ja auch besser gleich in C schreibt...)

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.