【问题标题】:How do I write the following inline assembly code in Visual C++ 6.0?如何在 Visual C++ 6.0 中编写以下内联汇编代码?
【发布时间】:2009-07-22 04:13:22
【问题描述】:

我正在用 C 语言在 GCC(适用于 Linux/Ubuntu)中编写一个使用以下内联汇编的应用程序。

float a[4] = { 10, 20, 30, 40 };
float b[4] = { 0.1, 0.1, 0.1, 0.1 };

asm volatile("movups (%0), %%xmm0\n\t"
             "mulps (%1), %%xmm0\n\t"
             "movups %%xmm0, (%1)"
             :: "r" (a), "r" (b));

请原谅上面的错别字(我是凭记忆写的)。 Visual C++ 6.0 中等效的内联汇编器是什么?我发现我需要移植我的代码。

【问题讨论】:

标签: c assembly inline-assembly visual-c++-6 visual-studio-6


【解决方案1】:
__declspec(align(16)) float a[4] = { 10, 20, 30, 40 };
__declspec(align(16)) float b[4] = { 0.1f, 0.1f, 0.1f, 0.1f };

__asm {
    movups xmm0, a; // could be movaps if array aligned
    mulps xmm0, b;
    movups b, xmm0; // could be movaps if array aligned
}

我不确定 Visual C++ 6,但它可以在 Visual C++ 2008 中使用。

【讨论】:

  • TBH 如果您将浮点数组对齐到 16 个字节,您也可以使用 movaps,因为它会快很多倍......
  • @Goz,在回答中添加了您的注释。我试着写一份问题的精确副本,并出于习惯添加了__declspec(align(16))
  • 嘿,我刚刚阅读了一些关于对齐的内容,并且这个解决方案(关于对齐和 movaps 指令)可能不会受到此线程上所选答案中提出的问题的影响: stackoverflow.com/questions/841433/…
猜你喜欢
  • 2021-01-19
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多