www.mikrocontroller.net

Forum: Compiler & IDEs Inline Assembler Problem


Autor: Debugger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Debugger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.