我编译了这段代码并得到了运行时检查失败#2 - 围绕变量'结果'已损坏例外。但是当我将结果数组大小从2更改为4异常消失时。你能解释一下为什么会这样吗? 对不起,如果你发现这个问题太基础了。
#include "stdafx.h"
string get_cpu_name()
{
uint32_t data[4] = { 0 };
_asm
{
cpuid;
mov data[0], ebx;
mov data[4], edx;
mov data[8], ecx;
}
return string((const char *)data);
}
void assembler()
{
cout << "CPU is " << get_cpu_name() << endl;
float f1[] = { 1.f , 22.f};
float f2[] = { 5.f , 3.f };
float result[2] = { 0.f };
/*float f1[] = { 1.f , 22.f , 1.f , 22.f };
float f2[] = { 5.f , 3.f , 1.f , 22.f };
float result[4] = { 0.f };*/
_asm
{
movups xmm1, f1;
movups xmm2, f2;
mulps xmm1, xmm2;
movups result, xmm1;
}
/*for (size_t i = 0; i < 4; i++)*/
for (size_t i = 0; i < 2; i++)
{
cout << result[i] << "\t";
}
cout << endl;
}
int main()
{
assembler();
getchar();
return 0;
}
答案 0 :(得分:2)
movups
指令writes 128 bits (16 bytes) to memory。您正在将其写入8字节数组(2 * 4字节或64位)的位置。数组后的8个字节也将被写入。
您应该确保至少有16个字节的空间来写入结果,或者您应该确保在那里写入少于16个字节。