Forum: Compiler & IDEs Inline assembler bei m68hc12


von Johannes S. (jhs)


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:
1
asm {
2
3
           ldy  tmp1
4
5
           ldd  #1000
6
7
           EMULS
8
9
           ldx  tmp2
10
11
           EDIVS
12
13
           sty tmp1
14
15
}

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:
1
   asm ("ldy %0" : "p"(tmp1));
2
   asm ("ldd #1000");
3
   asm ("EMULS");
4
   asm ("ldx %0" : "p"(tmp2));
5
   asm ("EDIVS");
6
   asm ("sty %0" : "=p"(tmp1));

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

Danke,
Johannes

von Johann L. (gjlayde) Benutzerseite


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

von Johannes S. (jhs)


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

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.