我正在尝试使用内联汇编进行向量添加,并且在逐行调试时,似乎我得到了正确的值,但是在包含内联ASM的函数返回其值后,它崩溃。这是整个代码:
#include <mmintrin.h>
#include <xmmintrin.h>
#include <emmintrin.h>
#include <pmmintrin.h>
#include <tmmintrin.h>
#include <smmintrin.h>
#include <nmmintrin.h>
#include <wmmintrin.h>
#include <immintrin.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
__declspec(align(16)) struct AlignedPackedScalarStorage
{
float x;
float y;
float z;
float w;
friend AlignedPackedScalarStorage operator+(const AlignedPackedScalarStorage& l, const AlignedPackedScalarStorage& r)
{
AlignedPackedScalarStorage output;
__asm
{
MOV EAX, [l]
MOV EBX, [r]
MOVAPS XMM0, [EAX]
MOVAPS XMM1, [EBX]
ADDPS XMM0, XMM1
MOVAPS [output], XMM0
}
return(output);
};
};
struct UnalignedPackedScalarStorage
{
float x;
float y;
float z;
float w;
};
int main()
{
AlignedPackedScalarStorage A = { 1, 2, 3, 4 };
AlignedPackedScalarStorage B = { 2, 3, 4, 5 };
AlignedPackedScalarStorage C = { 3, 5, 7, 9 };
AlignedPackedScalarStorage D = A + B;
cout << "Non SIMD:" << endl;
cout << "X:" << C.x << endl;
cout << "Y:" << C.y << endl;
cout << "Z:" << C.z << endl;
cout << "W:" << C.w << endl<<endl;
cout << "SIMD:" << endl;
cout << "X:" << D.x << endl;
cout << "Y:" << D.y << endl;
cout << "Z:" << D.z << endl;
cout << "W:" << D.w << endl << endl;
system("pause");
return(0);
}
它给了我错误:
ASMTest.exe中0x013A4143处的未处理异常:0xC0000005:Access 违规写入位置0x40800000。
在+运算符中,'l'和'r'是C ++语法中的引用,但是从内联ASM中它就像指针一样处理它们,对吧?MOVAPS接受一个指针并从它移动128位给定给定的指针XMM寄存器。我在调试时挂起[输出]并且在其中添加了正确的值。结构是对齐的,因此使用MOVAPS而不是MOVEUPS没有任何问题。