2017-01-23 3 views
0

私はarduinoでコーディングしていますが、私のCコードの間にアセンブリコードも使用しています。私は値の罪を計算したい。これまでのところ、私はこのコードを持っている:AVRインラインアセンブリ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); 
} 

私はこのために取得するエラーがある:「ASM」で一貫性のないオペランド制約 面白いことに、私は最後の行(シリアルを削除すると、このエラーが出るいけないということです。

また、私はこのコードをavrではなく8086のアセンブラで見つけました。そして8086で "= t"は浮動小数点に特有ですが、avrに似たものは何も見つかりません。

+1

AVRに 'fsin'というようなアセンブラコマンドはありません。これはC関数呼び出しであり、そのように扱われる必要があります( 'CALL')。 – tofro

答えて

1

使用している8ビットAVRには、ほぼ確実にfsin命令がありません。 8086とAVRは2つの異なるアーキテクチャであるため、異なる命令を持つことになり、同じ名前の命令も異なる意味を持つ可能性があります。アーキテクチャ間でアセンブリコードをコピーすることは期待できません。 8ビットのAVRは、浮動小数点数を全くサポートしていません。あなたのコンパイラによってソフトウェアに追加されます。

あなたが探しているのはavr-libcで提供されているsin機能です。これは普通のC関数です。最初に#include <math.h>をプログラムの先頭に追加し、次にanswer = sin(angle);のようなコードを書くことで呼び出すことができます。