这段代码(将4个 vector 加倍)可以工作:
__declspec(align(16)) struct vec4 { float a[4]; };
int main()
{
vec4 c;
c.a[0]=2;
c.a[1]=0;
c.a[2]=0;
c.a[3]=0;
__asm {
movaps xmm1, c
addps xmm1, xmm1
movaps c, xmm1
}
}
但是,这一段代码(执行相同操作,但现在使用指向已对齐数据的指针)没有:
__declspec(align(16)) struct vec4 { float a[4]; };
int main()
{
vec4* c = new vec4;
c->a[0]=2;
c->a[1]=0;
c->a[2]=0;
c->a[3]=0;
__asm {
movaps xmm1, c
addps xmm1, xmm1
movaps c, xmm1
}
}
为什么?
我需要它与指针一起使用,因为我不能将对齐的数据本身用作函数参数。
最佳答案
必须按照某些规则对ASM中的指针进行处理,您可以通过学习how "MOV" works来学到很多。
根据汇编程序的规则,您首先需要将指针复制到cpu寄存器。然后您可以使用它指向内存位置。
vec4 *d = ...;
__asm {
mov eax, d
movaps xmm1, [eax]
addps xmm1, xmm1
movaps [eax], xmm1
}