大牛进来吧:关于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]; };
}; 这个恐怕不只是调用nasm的问题,gcc本省生成的asm就是AT&T风格的,所以你需要让gcc本身生成的代码也是intel风格的。
不过,为了一点代码就去修改gcc岂不是很不值得,把这些代码转成AT&T风格就是了。
回复 #2 mingyanguo 的帖子
可以用-masm=intel指定输出汇编为intel格式^_^ 原帖由 albcamus 于 2007-3-8 09:39 发表于 3楼可以用-masm=intel指定输出汇编为intel格式^_^
:oops: 选项太多了,还从来没有注意过有这个。
这样是很方便了。 嗯,就是说是可以的咯,但好像没人说具体步骤啊!有那位牛牛能说具体一点嘛!
还有好多事情要做,打算把精力投入的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;
} g++不行么 :shock: 原帖由 albcamus 于 2007-3-8 09:39 发表于 3楼
可以用-masm=intel指定输出汇编为intel格式^_^
还是不同,我试了下,这样产生的asm码里,寄存器还是会被加上%的 可以试试使用intel编译器来编译 原帖由 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 编辑 ] 不知道gcc是否有选项, 可以使得汇编输出没有寄存器前缀%、 并在.intel_syntax伪指令后添加noprefix标识。
页:
[1]