mikrocontroller.net

Forum: Compiler & IDEs Inline assembler bei m68hc12


Autor: Johannes Schmid (jhs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versuche gerade m68hc12-Code, der ursprünglich für den CodeWarrior 
Compiler geschrieben ist auf gcc zu portieren. Beim Code hat auch alles 
ganz gut geklappt, aber ich scheitere am inline assembler. Ich würde 
gerne folgendes auf den GNU assembler umschreiben:
asm {

           ldy  tmp1

           ldd  #1000

           EMULS

           ldx  tmp2

           EDIVS

           sty tmp1

}

Der Code macht meiner Meinung nach:
* tmp1 mal 1000
* tmp1 = tmp1 / tmp2 (32 Bit signed / 16 bit signed)
* Ergebnis nach tmp1

Hab das dann mal mit GNU probiert:
   asm ("ldy %0" : "p"(tmp1));
   asm ("ldd #1000");
   asm ("EMULS");
   asm ("ldx %0" : "p"(tmp2));
   asm ("EDIVS");
   asm ("sty %0" : "=p"(tmp1));

Aber ich komme mit dem "Constraits" irgendwie nicht klar.

Danke,
Johannes

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eins vorweg: von m68 hab ich keinen Plan :-)

Das inline asm muss in einem Stück sein, ansonsten kann gcc was 
wegoptimieren oder dem tmp1 im ersten asm ein anderes Register zuordnen 
als dem tmp1 im 5ten asm (Falls "p" eine Registerklasse ist).

Wenn das irgendeine Wirkung hat, die über das Setzten von tmp1 
hinausgeht, genügt "asm" nicht. Es muss dann "asm volatile" sein.

Dann: Wenn das in blankem C/C++ geht, texte es einfach mal aus und 
schau, was gcc draus macht. Vielleicht ist es je schon das, was du 
willst.

Für weitere Anmerkungen wär hilfreich zu wissen, welche Klasse von 
Operanden zB ldy/sty braucht und was für Dinger tmp1 und tmp2 sind. 
Momentan ist das nicht ersichtlich, weil "p" keine Standard-Constraint 
ist, sondern maschinenspezifisch.

Johann

Autor: Johannes Schmid (jhs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Hab die ganze inline asms jetzt mal in C Code umgeschrieben. Sieht so 
aus als erzeugt gcc etwas clevereren Code (Merke: Assembler ist nicht 
unbedingt schneller), aber ich konnte es noch nicht testen, weil mein 
Flash-Tool gerade versagt.

Trotzdem danke für den Tipp,
Johannes

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.