我正在使用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;
}

最佳答案

应该使用操作数,而不是内联汇编程序中的名称。只需将%root替换为%0%a替换为%1%b替换为%2等。
查看here了解更多详细信息。

关于c - 扩展的内联汇编gcc-计算二次公式根,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28893322/

10-11 16:42