Arduino AVR内联程序集Fsin操作数约束
我用arduino编码,但我也在c代码之间使用汇编代码。我想计算一个值的sin。到目前为止,我有以下代码:Arduino AVR内联程序集Fsin操作数约束,arduino,constraints,avr,inline-assembly,Arduino,Constraints,Avr,Inline Assembly,我用arduino编码,但我也在c代码之间使用汇编代码。我想计算一个值的sin。到目前为止,我有以下代码: 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;
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”中的操作数约束不一致
有趣的是,当我删除最后一行(Serial.print(answer))时,我没有得到这个错误
我还发现这段代码用于8086汇编程序,而不是avr,在8086中,“=t”专门用于浮点数,但我找不到任何类似于avr的代码。无论您使用的是什么8位avr,几乎肯定都没有
fsin
指令。由于8086和AVR是两种不同的体系结构,它们将有不同的指令,同样名称的指令也可能有不同的含义。您不能期望将汇编代码从一个体系结构复制到另一个体系结构。8位AVR根本不支持浮点数;由编译器添加到软件中
您需要的是avr libc提供的
sin
功能。这只是一个普通的C函数,您可以通过首先将#include
添加到程序顶部,然后编写类似answer=sin(angle)的内容来调用它代码>在AVR上没有像fsin
这样的汇编命令。这是一个C函数调用,需要这样处理(call
)。