Subtraktion von Float Inlineprogrammierung

OP #2296780
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.
#2296845
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
Gast #2297518
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;)
Persönliche Seite #2297520
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
}

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