Я пишу программу, используя gcc расширенный встроенный код сборки, чтобы написать программу, которая вычисляет один из квадратичных корней (из квадратичной формулы). Я написал все мой код, и я постоянно встречая следующее сообщение об ошибке:Расширенная встроенная сборка gcc - вычисление квадратичных корней формулы
«недействителен„ASM“: операнд номер отсутствует после% -Письма»
Я получаю эту ошибку в 7 раз, когда я пытаюсь скомпилировать моя программа. Мой главный вопрос: что это значит и почему это происходит? Это домашнее задание, поэтому я не прошу решения как такового, но я просто не могу понять, что это сообщение об ошибке означает, с какими частями моего кода он применяется (переменные, я думаю ? прямо сейчас)
вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// function for checking that your assembly code is computing the correct result
double quadraticRootC(double a, double b, double c)
{
return (-b + sqrt(b * b - 4 * a * c))/(2 * a);
}
double quadraticRoot(double a, double b, double c)
{
// write assembly code below to calculate the quadratic root
double root;
asm(
"fld %a \n"
"fadd %%ST \n"
"fld %a \n"
"fld %c \n"
"fmulp %%ST(1) \n"
"fadd %%ST \n"
"fadd %%ST \n"
"fchs \n"
"fld %b \n"
"fld %b \n"
"fmulp %%ST(1) \n"
"faddp %%ST(1) \n"
"ftst \n"
"fstsw %%AX \n"
"sahf \n"
"fsqrt \n"
"fld %b \n"
"fchs \n"
"fdivp %%ST(1) \n"
"mov %root, %%eax \n"
"fstp %%qword, %%eax \n"
"mov $1, %%eax \n"
"jmp short done \n"
"done: \n"
:"=g"(root)
:"g"(a), "g"(b), "g"(c)
:"eax"
);
return(root);
}
int main(int argc, char **argv)
{
double a, b, c;
double root, rootC;
printf("CS201 - Assignment 2p - Hayley Howard\n"); // print your own name instead
if (argc != 4)
{
printf("need 3 arguments: a, b, c\n");
return -1;
}
a = atof(argv[1]);
b = atof(argv[2]);
c = atof(argv[3]);
root = quadraticRoot(a, b, c);
rootC = quadraticRootC(a, b, c);
printf("quadraticRoot(%.3f, %.3f, %.3f) = %.3f, %.3f\n", a, b, c, root, rootC);
return 0;
}
Не знаю, спасибо. –