2017-01-23 13 views
0

Я кодирую в arduino, но я также использую код сборки между моим кодом c. Я хочу рассчитать грех значения. до сих пор у меня есть этот код:Ограничения операндов AVR inline-assembly 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» самое смешное, что я не получаю эту ошибку, когда я удалить последнюю строку (Serial. print (ответить))

также я нашел этот код для ассемблера 8086, а не avr и в 8086 «= t» определен для поплавков, но я не могу найти ничего подобного для avr.

+1

Нет такой команды ассемблера, как 'fsin' на AVR. Это вызов функции C и должен обрабатываться как таковой ('CALL'). – tofro

ответ

1

Какой бы 8-разрядный AVR, который вы используете, почти наверняка не имеет инструкции fsin. Поскольку 8086 и AVR представляют собой две разные архитектуры, у них будут разные инструкции, а также инструкции с тем же именем могут иметь разные значения. Вы не можете ожидать копирования кода сборки из одной архитектуры в другую. 8-битные AVR не имеют встроенной поддержки чисел с плавающей запятой; который добавляется в программное обеспечение вашим компилятором.

Что вы ищете, является функцией sin, предоставляемой avr-libc. Это обычная функция C, которую вы можете вызвать, сначала добавив #include <math.h> в начало вашей программы, а затем написав что-то вроде answer = sin(angle);.

 Смежные вопросы

  • Нет связанных вопросов^_^