Inline assembler bei m68hc12

OP #1210333
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
Persönliche Seite #1210603
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
OP #1213307
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

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