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的原因。:)您也可以摆脱负载,将其留给编译器处理。