我为什么会有数类型不匹配的错误用gcc编译的汇编代码是什么时候?(Why will I have o

2019-09-30 05:19发布

下列代码可用于计算sincos值,如果角度给出。 为了尽可能快地计算出这些功能,汇编代码实现方式通过。

#include <stdio.h>

float sinx( float degree ) {
    float result, two_right_angles = 180.0f ;
    __asm__ __volatile__ ( "fld %1;"
                            "fld %2;"
                            "fldpi;"
                            "fmul;"
                            "fdiv;"
                            "fsin;"
                            "fstp %0;" 
                            : "=g" (result) 
                            : "g"(two_right_angles), "g" (degree)
    ) ;
    return result ;
}

float cosx( float degree ) {
    float result, two_right_angles = 180.0f, radians ;
    __asm__ __volatile__ ( "fld %1;"
                            "fld %2;"
                            "fldpi;"
                            "fmul;"
                            "fdiv;"
                            "fstp %0;" 
                            : "=g" (radians) 
                            : "g"(two_right_angles), "g" (degree)
    ) ;
    __asm__ __volatile__ ( "fld %1;"
                            "fcos;"
                            "fstp %0;" : "=g" (result) : "g" (radians)
    ) ;
    return result ;
}

float square_root( float val ) {
    float result ;
    __asm__ __volatile__ ( "fld %1;"
                            "fsqrt;"
                            "fstp %0;" 
                            : "=g" (result) 
                            : "g" (val)
    ) ;
    return result ;
}

int main() {
    float theta ;
    printf( "Enter theta in degrees : " ) ;
    scanf( "%f", &theta ) ;

    printf( "sinx(%f) = %f\n", theta, sinx( theta ) );
    printf( "cosx(%f) = %f\n", theta, cosx( theta ) );
    printf( "square_root(%f) = %f\n", theta, square_root( theta ) ) ;

    return 0 ;
}

上述代码来自于这里 ,我试图用gcc编译上面的代码:

g++ -Wall -fexceptions  -g     -c /filename.cpp  

但是,它失败,以下错误消息给出:

Error: operand type mismatch for `fstp'|
Error: operand type mismatch for `fstp'|

我想知道,为什么编译会失败,我怎么能成功编译它们。 谢谢!

Answer 1:

的手册说,大约g约束: Any register, memory or immediate integer operand is allowed, except for registers that are not general registers 。 编译器可能拿起其中一个寄存器fstp不接受,但适合的约束。

顺便说一句,这是很可怕的内联汇编。

另外请注意,只是因为事情是在ASM,它不一定会更快。 编译器是相当能够优化的东西和它做了更好的工作了。 你可能会感兴趣的-ffast-math开关。 从return sin(degree * M_PI / 180); 编译器产生这一小片的代码:

fldl    .LC0
fmuls   4(%esp)
fsin
ret


文章来源: Why will I have operand type mismatch error when compiling the assembly codes with gcc?
标签: gcc assembly g++