代码之家  ›  专栏  ›  技术社区  ›  aCuria

在线装配

  •  2
  • aCuria  · 技术社区  · 16 年前

    对于下面的代码,如果我想将for循环转换为内联程序集,该如何完成? (请原谅这奇怪的代码,我只是编出来的。)

    1)用于x86,使用Visual Studio

    2)这是一个“如何在线组装”问题,而不是一个“如何优化此代码”问题。

    3)任何其他例子都可以。我将在ABIT中考虑一些更好的示例代码。

    好吧,我希望这是一个更好的例子:

    int doSomething(double a, double b, double c)
    {
        double d;
        for(int i=100;i<200;i++)
        {
            d = a*a + b*b + c*c;
            if(d>i)
                return (i-99);
        }
        return -1;
    }
    
    6 回复  |  直到 16 年前
        1
  •  5
  •   please delete me    16 年前

    它可能会从这样一个不完整的、有点低效的例子开始。不过,应该演示语法。

    double doSomething(void) {
        double a=1,b=2,c=3;
        __asm {
            mov ecx,10
    loop:
            fld a // a
            fmul st(0),st(0) // aa
            fld b // b aa
            fmul st(0),st(0) // bb aa
            fsubp // aa-bb
            fstp c // c = a*a-b*b
    
            // and so on
    
            dec ecx
            jnz loop
        }
        return a+b+c;
    }
    

    使用SSE指令是另一种选择。

    这里介绍了VC++内联汇编程序: http://msdn.microsoft.com/en-us/library/4ks26t93.aspx

    英特尔处理器参考手册如下: http://www.intel.com/products/processor/manuals/

        3
  •  2
  •   Edward Strange    16 年前

    完全依赖于编译器和体系结构。您需要在Web上搜索关于编译器的内联ASM的信息,然后学习体系结构的ASM操作代码(使用正确的ASM方言——依赖于编译器)。

        4
  •  1
  •   Paul R    16 年前

    您可以在不使用汇编程序的情况下对此进行优化:

    double doSomething(void)
    {
        double a = 1.0, b = 2.0, c = 3.0;
        c = a * a - b * b;
        b = c;
        return a + b + c;
    }
    

    或者,如果您提高优化级别:

    double doSomething(void)
    {
        return -5.0;
    }
    
        5
  •  1
  •   Stephen Kellett    16 年前

    没有真正的点学习内联汇编。X64不支持它(即使用Visual Studio)。无论您现在使用还是不使用X64,在某个时候,您将是并且内联将是历史记录。

    更好地学习如何使用masm,而您在x86中所学的内容对于x64仍然有用。

        6
  •  0
  •   Thomas Matthews    16 年前

    最好的选择是让编译器打印函数的汇编语言。将其用作内联程序集的基线。

    一般来说,应该避免内联汇编,因为它是平台特定的,特别是处理器特定的。更好的解决方案是将函数放入单独的文件中。创建C语言版本和汇编语言版本。在构建过程中,在不同的文件之间进行选择。这将允许您为不同的平台和处理器使用不同的汇编语言版本,对程序的其余部分产生最小的副作用(这非常重要)。

    推荐文章