c++ - MSVC 内联汇编到 GCC(带参数和返回)

标签 c++ gcc assembly inline

inline float sqrt2(float sqr)
{
    float root = 0;

    __asm
    {
    sqrtss xmm0, sqr
    movss root, xmm0
    }

    return root;
}

这是我想用 gcc x86 编译的 MSVC 编译器内联程序集,我知道 gcc 内联程序集是用 asm("asm here"); 调用的但我完全不知道如何在其中包含参数,结果是通过“=r”获得的,我只知道。

这应该会导致类似的结果:

asm("sqrtss xmm0, %1\n\t"
        "movss %0, xmm0"
        : "=r" (root)
        : "r" (sqr));

最佳答案

r 约束适用于通用寄存器。 x 代表 xmm。咨询manual更多细节。另外,如果您在内联汇编中使用 mov,您可能会做错。

inline float sqrt2(float sqr)
{
    float root = 0;

    __asm__("sqrtss %1, %0" : "=x" (root) : "x" (sqr));

    return root;
}

请注意,gcc 完全能够从 sqrtf 库函数调用生成 sqrtss 指令。您可以使用 -fno-math-errno 来消除一些小错误检查开销。

关于c++ - MSVC 内联汇编到 GCC(带参数和返回),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50042567/

相关文章:

c++ - gl.h #定义灯光

C++ 位操作

c++ - 为什么 fmod 会产生不同的结果?

audio - 在程序集 8086 中生成声音

c - 结构数据项的内存地址

C++ 如何找到窗口中两点之间的 vector ?

c++ - 带有对 type_info 的引用的 std::common_type

c - 了解编译 C 代码时发生错误的阶段

c - 在 GCC 中编译时在 C 中编辑操作的 ASM 结果

linux - 如何在 Linux 上获取中断向量号?