wudt 发表于 2007-03-08 01:03

大牛进来吧:关于NASM虐在linux下汇编Intel格式的问题!

要优化一段在linux下的代码,有类似的嵌入Intel汇编的vector.cpp文件一个,如果我装了NASM的话,可以直接使用这个vector.cpp吗?如果可以,该如何修改gcc,让它自动调用NASM来汇编,而不是调用AS,请大牛指点一下!具体些或者给出个链接!
谢谢了!

下面是vector.cpp代码:


class vector
{
    public:
        float x,y,z,w;

    inline vector()
{ ; };
    inline vector(float x0,float y0,float z0)
{ x=x0; y=y0; z=z0; };
    inline vector(float x0,float y0,float z0,float w0)
{ x=x0; y=y0; z=z0; w=w0; };
    inline vector(vector &v)
{ *this=v; };
    inline void null(void)
{ x=y=z=0; };
    inline float length(void)
{ return (float)sqrt(x*x+y*y+z*z); };
    inline voidvec(float x0,float y0,float z0)
{ x=x0; y=y0; z=z0; };
    inline voidvec(float x0,float y0,float z0,float w0)
{ x=x0; y=y0; z=z0; w=w0; };
    inline voidnegate(void)
{ x=-x; y=-y; z=-z; };
    inline void cross(vector& v1,vector& v2)
{

#ifdef P3SIMD
        __asm
{
        mov esi, v1
        mov edi, v2

        movups xmm0, [esi]
        movups xmm1, [edi]
        movups xmm2, xmm0
        movups xmm3, xmm1

        shufps xmm0, xmm0, 0xc9
        shufps xmm1, xmm1, 0xd2
        mulps xmm0, xmm1

        shufps xmm2, xmm2, 0xd2
        shufps xmm3, xmm3, 0xc9
        mulps xmm2, xmm3

        subps xmm0, xmm2

        mov esi, this
        movups [esi],xmm0
}
#else
        x=v1.y*v2.z-v1.z*v2.y;
        y=v1.z*v2.x-v1.x*v2.z;
        z=v1.x*v2.y-v1.y*v2.x;
#endif
}
    inline void normalize(void)
{
     float len=(float)sqrt(x*x+y*y+z*z);
     if (FP_BITS(len)==0) return;
     len=1.0f/len;
     x*=len; y*=len; z*=len;
}
    inline float& operator[](int i) { return (&x)[i]; };
};

mingyanguo 发表于 2007-03-08 08:41

这个恐怕不只是调用nasm的问题,gcc本省生成的asm就是AT&T风格的,所以你需要让gcc本身生成的代码也是intel风格的。

不过,为了一点代码就去修改gcc岂不是很不值得,把这些代码转成AT&T风格就是了。

albcamus 发表于 2007-03-08 09:39

回复 #2 mingyanguo 的帖子

可以用-masm=intel指定输出汇编为intel格式^_^

mingyanguo 发表于 2007-03-08 11:34

原帖由 albcamus 于 2007-3-8 09:39 发表于 3楼
可以用-masm=intel指定输出汇编为intel格式^_^
:oops: 选项太多了,还从来没有注意过有这个。
这样是很方便了。

wudt 发表于 2007-03-08 17:03

嗯,就是说是可以的咯,但好像没人说具体步骤啊!有那位牛牛能说具体一点嘛!
还有好多事情要做,打算把精力投入的GPU那边的优化上,这CPU上的优化实在来不急,只能用C++了!没时间自己查资料找办法了!告诉我如何编译链接这个程序即可!先谢谢了!
#include <iostream>
int main()
{
   vectorv1(1.0,2.0,3.0),v2(3.0,2.0,1.0),v(0.0,0.0,0.0);
   v.cross(v1,v2);
   std::cout << v.x << "" << v.y << "" << v.z << std::endl;
   return 0;
}

mingyanguo 发表于 2007-03-09 08:48

g++不行么 :shock:

cjaizss 发表于 2007-03-09 23:51

原帖由 albcamus 于 2007-3-8 09:39 发表于 3楼
可以用-masm=intel指定输出汇编为intel格式^_^
还是不同,我试了下,这样产生的asm码里,寄存器还是会被加上%的

wsgtrsys 发表于 2007-03-10 07:53

可以试试使用intel编译器来编译

albcamus 发表于 2007-03-12 10:49

原帖由 cjaizss 于 2007-3-9 23:51 发表于 7楼

还是不同,我试了下,这样产生的asm码里,寄存器还是会被加上%的

这个只能手工改动。

例如下面这个简单的C程序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
        int a = 0;
        a += 4;
        printf("Hello from %s\n", __FILE__);


        return 0;
}



# gcc -S-masm=intel aa.c


# cat aa.s
      .file   "aa.c"
      .intel_syntax
      .section      .rodata
.LC0:
      .string "aa.c"
.LC1:
      .string "Hello from %s\n"
      .text
.globl main
      .type   main, @function
main:
      lea   %ecx, [%esp+4]
      and   %esp, -16
      push    DWORD PTR [%ecx-4]
      push    %ebp
      mov   %ebp, %esp
      push    %ecx
      sub   %esp, 36
      mov   DWORD PTR [%ebp-8], 0
      add   DWORD PTR [%ebp-8], 4
      mov   DWORD PTR [%esp+4], OFFSET FLAT:.LC0
      mov   DWORD PTR [%esp], OFFSET FLAT:.LC1
      call    printf
      mov   %eax, 0
      add   %esp, 36
      pop   %ecx
      pop   %ebp
      lea   %esp, [%ecx-4]
      ret
      .size   main, .-main
      .ident"GCC: (GNU) 4.1.1 20061011 (Red Hat 4.1.1-30)"
      .section      .note.GNU-stack,"",@progbits




然后, 在vi中把所有的寄存器前缀%去掉, 并且在第2行.intel_syntax 后面加上noprefix:


# cat intel.s
      .file   "aa.c"
      .intel_syntax noprefix
      .section      .rodata
.LC0:
      .string "aa.c"
.LC1:
      .string "Hello from %s\n"
      .text
.globl main
      .type   main, @function
main:
      lea   ecx,
      and   esp, -16
      push    DWORD PTR
      push    ebp
      mov   ebp, esp
      push    ecx
      sub   esp, 36
      mov   DWORD PTR , 0
      add   DWORD PTR , 4
      mov   DWORD PTR , OFFSET FLAT:.LC0
      mov   DWORD PTR , OFFSET FLAT:.LC1
      call    printf
      mov   eax, 0
      add   esp, 36
      pop   ecx
      pop   ebp
      lea   esp,
      ret
      .size   main, .-main
      .ident"GCC: (GNU) 4.1.1 20061011 (Red Hat 4.1.1-30)"
      .section      .note.GNU-stack,"",@progbits
# gcc -o intel intel.s
# ./intel
Hello from aa.c
#


[ 本帖最后由 albcamus 于 2007-3-12 14:13 编辑 ]

albcamus 发表于 2007-03-12 10:55

不知道gcc是否有选项, 可以使得汇编输出没有寄存器前缀%、 并在.intel_syntax伪指令后添加noprefix标识。
页: [1]
查看完整版本: 大牛进来吧:关于NASM虐在linux下汇编Intel格式的问题!