如何在 Visual C++ 6.0 中编写以下内联汇编代码?

Posted

技术标签:

【中文标题】如何在 Visual C++ 6.0 中编写以下内联汇编代码?【英文标题】:How do I write the following inline assembly code in 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 中等效的内联汇编器是什么?我发现我需要移植我的代码。

【问题讨论】:

您可能会发现使用 gcc-on-Window 端口之一将 Linux 应用程序移植到 Windows 更容易:wiki.answers.com/Q/How_do_you_install_GCC_in_Windows_XP 【参考方案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 指令)可能不会受到此线程上所选答案中提出的问题的影响: ***.com/questions/841433/…

以上是关于如何在 Visual C++ 6.0 中编写以下内联汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

在win7系统下,如何安装 Microsoft Visual C++ 6.0呢?谢谢····

使用 Visual c++ 6.0 时使用啥代码

Visual C++ 6.0 学术版,使用 MFC 作为静态库

C++ 代码在 msdev 6.0 中运行良好,在 Visual Studio 2010 中崩溃

如何将 jpg 文件加载到 CBitmap (visual c++ 6.0) 中?

如何将项目从 Visual C++ 6.0 转换为 Visual Studio Express 2010?