c++ - 使用内嵌 asm 编写一个带有 2 个比较的 for 循环

标签 c++ x86 inline-assembly

我想将以下代码中的 for 循环转换为汇编,但我不确定如何开始。我们将不胜感激解释如何执行此操作及其工作原理。

我正在使用 VS2010,C++,为 x86 编写。代码如下:

for (n = 0; norm2 < 4.0 && n < N; ++n) 
{
    __asm{
    ///a*a - b*b + x
        fld a // a
        fmul st(0), st(0) // aa
        fld b // b aa
        fmul st(0), st(0) // bb aa
        fsub // (aa-bb) // st(0) - st(1)
        fld x // x (aa-bb)
        fadd // (aa-bb+x)

    /// 2.0*a*b + y;
        fld d // d (aa-bb+x)
        fld a // d a (aa-bb+x)
        fmul // ad (aa-bb+x)
        fld b // b ad (aa-bb+x)
        fmul // abd (aa-bb+x)
        fld y // y adb (aa-bb+x)
        fadd // b:(adb+y) a:(aa-bb+x)

        fld st(0) //b b:(adb+y) a:(aa-bb+x)
        fmul st(0), st(0) // bb b:(adb+y) a:(aa-bb+x)
        fld st(2) // a bb b:(adb+y) a:(aa-bb+x)
        fmul st(0), st(0) // aa bb b:(adb+y) a:(aa-bb+x)
        fadd // aa+bb b:(adb+y) a:(aa-bb+x)
        fstp norm2 // store aa+bb to norm2, st(0) is popped.
        fstp b
        fstp a
    }
}

最佳答案

开始解决此类问题的最快捷、最简单的方法是首先以尽可能简单的形式用 C 或 C++ 编写代码,然后使用 C/C++ 编译器生成 asm。然后您可以使用这个生成的 asm 作为您自己的 asm 代码的模板。使用像 gcc 这样的合适的编译器,您可以使用 gcc -S 来执行此操作。我很确定 Visual Studio 在其 GUI 的某处隐藏了一个类似的选项(显然命令行开关是 /Fa)。

关于c++ - 使用内嵌 asm 编写一个带有 2 个比较的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817893/

相关文章:

c++ - 从瑞典语到英语的词汇表测试

linux - 在汇编中进行除法时出现浮点异常(核心已转储)

assembly - CALL 指令是否总是将 EIP 指向的地址压入堆栈?

c++ - 如何在 C++ 中加速平面到打包/交错图形?

gcc - 内联汇编错误,阻止 gcc 编译尝试

c - SSE2 和内联汇编插入结构

c++ - 使用 Qt (Ubuntu 14.04) 编译 qt-dab 时出错

c++ - 糟糕的树添加性能

c++ - 我在一维数组中渲染矩形的算法有什么问题?

x86 - 将 _mm_shuffle_epi32 转换为 C 表达式以进行排列?