Gcc 如何使用汇编代码获得双精度cos函数值?

Gcc 如何使用汇编代码获得双精度cos函数值?,gcc,assembly,Gcc,Assembly,我现在运行以下汇编代码以获取cos函数值: float cosx( float radians ) { float result; __asm__ __volatile__ ( "fld %1;" "fcos;" "fstp %0;" : "=m" (result)

我现在运行以下汇编代码以获取
cos
函数值:

float cosx( float radians ) {
    float result;

    __asm__ __volatile__ ( "fld %1;"
                            "fcos;"
                            "fstp %0;"
                            : "=m" (result)
                            : "m" (radians)
    ) ;
    return result ;
}
但是,上述函数可以接受float参数,并且获得的函数值也是float类型。因此,我编写了一个类似的函数,可以接受双参数,并且返回的函数值也应该达到双精度:

double cosx( double radians ) {
    double result;

    __asm__ __volatile__ ( "fld %1;"
                            "fcos;"
                            "fstp %0;"
                            : "=m" (result)
                            : "m" (radians)
    ) ;
    return result ;
}
然而,第二个功能已被证明不能正常工作。因此,我想知道我应该做些什么,以使第二个功能工作良好。谢谢我使用gcc编译上述代码

编辑: 在这里,我将说明第二个函数无法正常工作的原因:

int main() {
    float theta ;
    printf( "Enter theta  : " ) ;
    scanf( "%f", &theta ) ;  
     printf( "cosx(%f) = %lf\n", theta, cosx(theta) );  // line 5
     printf( "cosx(%f) = %lf\n", theta, cosx(double(theta)) ); // line 6

    return 0 ;
}
正如我们可以看到的,第5行和第6行分别调用了第一个和第二个函数。我们希望它们可以具有相同的值。但是,演示程序的输出如下所示:

Enter theta in  :  0.5236 // pi/6
cos(0.5236) = 0.8660;
cos(0.5236) = 0.0000;

GCC对操作数类型很挑剔:

__asm__ __volatile__ ( "fld %1;"
                        "fcos;"
                        "fstp %0;"
                        : "=m" (result)
                        : "m" (radians)
应该是:

__asm__ __volatile__ ( "fldl %1;"
                        "fcos;"
                        "fstpl %0;"
                        : "=m" (result)
                        : "m" (radians)
尽管你也可以这样写:

__asm__ __volatile__ ( "fldl %1;"
                      "fcos;"
                      : "=t" (result)
                      : "m" (radians)
                      ) ;

(对于
float
版本也是如此)

GCC对操作数类型很挑剔:

__asm__ __volatile__ ( "fld %1;"
                        "fcos;"
                        "fstp %0;"
                        : "=m" (result)
                        : "m" (radians)
应该是:

__asm__ __volatile__ ( "fldl %1;"
                        "fcos;"
                        "fstpl %0;"
                        : "=m" (result)
                        : "m" (radians)
尽管你也可以这样写:

__asm__ __volatile__ ( "fldl %1;"
                      "fcos;"
                      : "=t" (result)
                      : "m" (radians)
                      ) ;

(对于
float
版本也是如此)

什么工作不正常?感谢您的关注,我添加了一个演示程序来说明这个问题。类似的代码在Visual Studio中也适用于我,不过当我在Cygwin中尝试您的示例时,我得到了与您相同的结果。什么工作不正常?感谢您的关注,我添加了一个说明程序来说明这个问题。类似的代码在Visual Studio中也适用,不过当我在Cygwin中尝试使用您的示例时,我得到的结果与您的结果相同。我不太了解AT&t,但我会猜到双倍,不是吗?@FrankKotler是的,您可能会猜到,但是AT&T语法认为64位浮点为“长”,32位浮点为“短”。。。这就是我不太了解AT&t的原因。:)你也可以摆脱负载,把它留给编译器。我对AT&t不太了解,但我会猜
fldq
是双精度的,不是吗?@FrankKotler是的,你可能会猜到,但AT&t语法认为64位浮点为“长”,32位浮点为“短”。嗯。。。这就是我不太了解AT&t的原因。:)您也可以摆脱负载,将其留给编译器处理。