2017-01-23 2 views
0

Je code dans arduino mais j'utilise aussi le code d'assemblage entre mon code c. je veux calculer le péché d'une valeur. Jusqu'à présent, j'ai ce code:Assemblage en ligne AVR Contraintes d'opérandes Fsin

void setup() { 
    // put your setup code here, to run once: 

} 

void loop() { 
    // put your main code here, to run repeatedly: 
    Serial.begin(9600); 
    float answer; 
    float angle = 2; 
    int a = 2; 
    int b = 3; 
    asm("ADD %0,%1" : "+r"(a) : "r"(b)); 
    asm("fsin" : "=t" (answer) : "0" (angle)); 
    Serial.print(answer); 
} 

l'erreur que je reçois pour cela est: les contraintes d'opérandes incohérents dans un « asm » le plus drôle est que je n'obtenir cette erreur quand je supprimer la dernière ligne (série. (réponse))

aussi j'ai trouvé ce code pour un assembleur 8086 et non avr et en 8086 "= t" est spécifique pour les flotteurs mais je ne trouve rien de semblable pour avr.

+1

Il n'y a pas de commande d'assembleur telle que 'fsin' sur un AVR. C'est un appel de fonction C et doit être traité comme tel ('CALL'). – tofro

Répondre

1

Quel que soit l'AVR 8 bits que vous utilisez, il est presque impossible d'avoir une instruction fsin. Depuis 8086 et AVR sont deux architectures différentes, ils vont avoir des instructions différentes et aussi des instructions avec le même nom peuvent avoir des significations différentes. Vous ne pouvez pas espérer copier le code d'assemblage d'une architecture à une autre. Les AVR 8 bits n'ont aucun support natif pour les nombres à virgule flottante; cela est ajouté dans le logiciel par votre compilateur. Ce que vous cherchez est la sin fonction fournie par avr-libc. Ceci est juste une fonction C normale que vous pouvez appeler en ajoutant d'abord #include <math.h> en haut de votre programme, puis en écrivant quelque chose comme answer = sin(angle);.