Forum: Compiler & IDEs Subtraktion von Float Inlineprogrammierung


von Christian M. (feaser)


Lesenswert?

Hallo,

ich versuche verzweifelt eine Floatzahl von einer anderen zu 
subtrahieren.
Ich arbeite mit einem Atmega2561 und in C bzw. mit Assember inline.
1
float asmsub(float x,float y){ // x - y
2
  
3
   asm ("FSUB  %[x], %[y]"   "\n\t"
4
5
                : [x] "+a" (x) 
6
                : [y] "a"  (y) 
7
         );
8
}

Da bekomme ich folgende Fehlermeldung:

Error  11  can't find a register in class 'SIMPLE_LD_REGS' while 
reloading 'asm'

Error  12  'asm' operand has impossible constraints



Unter http://www.mikrocontroller.net/articles/AVR_Arithmetik/Saturierung 
der letzte Quellcode ist genau das, was ich machen will. Aber ich weiß 
nicht wie ich es übersetzen soll.

Hier kommt bei
1
asm ("subi R16, 0x80  "   "\n\t"
die gleiche Fehlermeldung wie oben.

Kann mir jmd helfen?
Vielen Dank im Voraus.

von Jörg G. (joergderxte)


Lesenswert?

Schau dir den asm-Code an, den der Compiler da für generiert:
1
float fsub_sat(float a, float b, float min)
2
{
3
    float tmp  = a-b;
4
    if(tmp > min)
5
        return tmp;
6
    return min;
7
}
Und denk noch mal scharf nach, ob du wirklich floats brauchst (oder 
inline-asm)

hth, Jörg

ps.: der gcc-inline-assembler ist kompliziert
pps.: der AVR hat keine float-Befehle

von Klaus W. (mfgkw)


Lesenswert?

... und schon gar kein FSUB
Ein FMUL gibt es, aber das ist auch nicht für float.

von Karl H. (kbuchegg)


Lesenswert?

Es erhebt sich ausserdem die Frage, was du dir davon versprichst, wenn 
du

   float a = b - c;

in Assembler ausformulierst. Schneller als der Compiler kriegst du das 
auch nicht hin.

von Christian M. (feaser)


Lesenswert?

Danke für die Antworten. Ich wollte nur ein Stück Quelltext als 
Assembler programmieren, nur zu Demonstrationszecken.

Also heißt das, sowas zu programmieren würde viel Arbeit kosten?

von holger (Gast)


Lesenswert?

>Ich wollte nur ein Stück Quelltext als
>Assembler programmieren, nur zu Demonstrationszecken.
>Also heißt das, sowas zu programmieren würde viel Arbeit kosten?

Nein.

#define NOP   asm volatile ("nop" ::)

SCNR;)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ja. float-Arithmetik in Software zu Klöppeln ist aufwändig.

Wozu brauchst du denn überhaupt Constraint "a"?

Als Workaround, wenn du wirklich diese Constraint für float brauchst 
(Wahrscheinlichkeit = 0%), geht das:
1
float asmsub (float x, float y)
2
{
3
   register float rx asm ("r16") = x;
4
   register float ry asm ("r20") = y;
5
6
   asm ("FSUB %[x], %[y]"
7
                : [x] "+a" (rx)
8
                : [y] "a"  (ry)
9
        );
10
11
   return rx;
12
}

von Rolf Magnus (Gast)


Lesenswert?

Christian Micro schrieb:
> Also heißt das, sowas zu programmieren würde viel Arbeit kosten?

Ja. Da die AVRs keinen Gleitkomma-Koprozessor besitzen, kennen sie keine 
entsprechenden Befehle. Du mußt die Gleitkomma-Unterstützung dann in 
deinem Assembler-Code selbst "von Hand" machen, und das ist aufwendig.

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.