Ограничения операнда Fsin встроенной сборки AVR

я кодирую в arduino, но я также использую ассемблерный код между моим кодом c. Я хочу вычислить грех значения. пока у меня есть этот код:

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.


person Shekshaa    schedule 23.01.2017    source источник
comment
На AVR нет такой ассемблерной команды, как fsin. Это вызов функции C и должен обрабатываться как таковой (CALL).   -  person tofro    schedule 23.01.2017


Ответы (1)


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

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

person David Grayson    schedule 23.01.2017