我正在使用gcc扩展内联汇编代码编写程序来编写一个计算二次根之一的程序(来自二次公式)。我已经编写了所有代码,并且遇到了以下错误:
"无效' asm':%-letter"
后缺少操作数当我尝试编译程序时,我收到此错误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;
}
答案 0 :(得分:2)
如果要在内联asm中使用符号名称,则需要在约束中重新定义它们:
: [root] "=g"(root)
: [a] "g"(a), [b] "g"(b), [c] "g"(c)
然后在你的代码中引用它们,你会使用%[root],%[a]等。说到我自己,我发现名字比%0,%1等更容易阅读。另外,在开发过程中/测试你可以添加/删除参数,这将迫使你重新处理asm中的所有操作数,这是一个真正的痛苦。
有关详细信息,请参阅here。
答案 1 :(得分:0)
您应该使用操作数编号,而不是内联汇编程序中的名称。只需将%root
替换为%0
,%a
替换为%1
,%b
替换为%2
等。
查看here了解更多详情。