免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4702 | 回复: 9
打印 上一主题 下一主题

大牛进来吧:关于NASM虐在linux下汇编Intel格式的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-08 01:03 |只看该作者 |倒序浏览
要优化一段在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 void  vec(float x0,float y0,float z0)
{ x=x0; y=y0; z=z0; };
    inline void  vec(float x0,float y0,float z0,float w0)
{ x=x0; y=y0; z=z0; w=w0; };
    inline void  negate(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]; };
};

论坛徽章:
0
2 [报告]
发表于 2007-03-08 08:41 |只看该作者
这个恐怕不只是调用nasm的问题,gcc本省生成的asm就是AT&T风格的,所以你需要让gcc本身生成的代码也是intel风格的。

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

论坛徽章:
0
3 [报告]
发表于 2007-03-08 09:39 |只看该作者

回复 #2 mingyanguo 的帖子

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

论坛徽章:
0
4 [报告]
发表于 2007-03-08 11:34 |只看该作者
原帖由 albcamus 于 2007-3-8 09:39 发表于 3楼  
可以用-masm=intel指定输出汇编为intel格式^_^

选项太多了,还从来没有注意过有这个。
这样是很方便了。

论坛徽章:
0
5 [报告]
发表于 2007-03-08 17:03 |只看该作者
嗯,就是说是可以的咯,但好像没人说具体步骤啊!有那位牛牛能说具体一点嘛!
还有好多事情要做,打算把精力投入的GPU那边的优化上,这CPU上的优化实在来不急,只能用C++了!没时间自己查资料找办法了!告诉我如何编译链接这个程序即可!先谢谢了!
#include <iostream>
int main()
{
     vector  v1(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;
}

论坛徽章:
0
6 [报告]
发表于 2007-03-09 08:48 |只看该作者
g++不行么

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2007-03-09 23:51 |只看该作者
原帖由 albcamus 于 2007-3-8 09:39 发表于 3楼  
可以用-masm=intel指定输出汇编为intel格式^_^

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

论坛徽章:
1
处女座
日期:2013-08-19 12:39:10
8 [报告]
发表于 2007-03-10 07:53 |只看该作者
可以试试使用intel编译器来编译

论坛徽章:
0
9 [报告]
发表于 2007-03-12 10:49 |只看该作者
原帖由 cjaizss 于 2007-3-9 23:51 发表于 7楼  

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


这个只能手工改动。

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

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

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


  8.         return 0;
  9. }
复制代码



[root@localhost ~]# gcc -S  -masm=intel aa.c


  1. [root@localhost ~]# cat aa.s
  2.         .file   "aa.c"
  3.         .intel_syntax
  4.         .section        .rodata
  5. .LC0:
  6.         .string "aa.c"
  7. .LC1:
  8.         .string "Hello from %s\n"
  9.         .text
  10. .globl main
  11.         .type   main, @function
  12. main:
  13.         lea     %ecx, [%esp+4]
  14.         and     %esp, -16
  15.         push    DWORD PTR [%ecx-4]
  16.         push    %ebp
  17.         mov     %ebp, %esp
  18.         push    %ecx
  19.         sub     %esp, 36
  20.         mov     DWORD PTR [%ebp-8], 0
  21.         add     DWORD PTR [%ebp-8], 4
  22.         mov     DWORD PTR [%esp+4], OFFSET FLAT:.LC0
  23.         mov     DWORD PTR [%esp], OFFSET FLAT:.LC1
  24.         call    printf
  25.         mov     %eax, 0
  26.         add     %esp, 36
  27.         pop     %ecx
  28.         pop     %ebp
  29.         lea     %esp, [%ecx-4]
  30.         ret
  31.         .size   main, .-main
  32.         .ident  "GCC: (GNU) 4.1.1 20061011 (Red Hat 4.1.1-30)"
  33.         .section        .note.GNU-stack,"",@progbits

复制代码



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


  1. [root@localhost ~]# cat intel.s
  2.         .file   "aa.c"
  3.         .intel_syntax noprefix
  4.         .section        .rodata
  5. .LC0:
  6.         .string "aa.c"
  7. .LC1:
  8.         .string "Hello from %s\n"
  9.         .text
  10. .globl main
  11.         .type   main, @function
  12. main:
  13.         lea     ecx, [esp+4]
  14.         and     esp, -16
  15.         push    DWORD PTR [ecx-4]
  16.         push    ebp
  17.         mov     ebp, esp
  18.         push    ecx
  19.         sub     esp, 36
  20.         mov     DWORD PTR [ebp-8], 0
  21.         add     DWORD PTR [ebp-8], 4
  22.         mov     DWORD PTR [esp+4], OFFSET FLAT:.LC0
  23.         mov     DWORD PTR [esp], OFFSET FLAT:.LC1
  24.         call    printf
  25.         mov     eax, 0
  26.         add     esp, 36
  27.         pop     ecx
  28.         pop     ebp
  29.         lea     esp, [ecx-4]
  30.         ret
  31.         .size   main, .-main
  32.         .ident  "GCC: (GNU) 4.1.1 20061011 (Red Hat 4.1.1-30)"
  33.         .section        .note.GNU-stack,"",@progbits
  34. [root@localhost ~]# gcc -o intel intel.s
  35. [root@localhost ~]# ./intel
  36. Hello from aa.c
  37. [root@localhost ~]#
复制代码

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

论坛徽章:
0
10 [报告]
发表于 2007-03-12 10:55 |只看该作者
不知道gcc是否有选项, 可以使得汇编输出没有寄存器前缀%、 并在.intel_syntax伪指令后添加noprefix标识。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP