2010-05-11 108 views
2

对于下面的代码,如果我想将for循环转换为联机汇编,它将如何完成? (原谅怪异代码,我只是做它。)联机汇编

1)这是为x86,使用视觉工作室

2)这是一个“如何在线路组件使用”的问题,而不是一个“如何优化此代码”问题

3)其他任何示例都可以。我会考虑一些更好的示例代码。

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

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

你有这样做的好理由吗?一个体面的编译器可能会比noob汇编程序员有更好的工作。你想要什么样的CPU? – 2010-05-11 15:48:19

+3

另请注意,你的代码在循环中有一个冗余表达式 - 第二行是无意义的,因为b立即被c替换。在尝试优化代码之前,您可能需要修复代码。 – 2010-05-11 15:49:45

+3

另一件事 - 循环本身是多余的,因为它内部的所有表达式都是循环不变的。你没有真的想过这件事,是吗? – 2010-05-11 15:51:22

回答

5

它可能会出现这样的不完整和有点低效的例子。但应该展示语法。

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/

+0

很好的答案。 +1 – 2010-05-11 16:31:04

1

您可以优化这种不诉诸汇编:

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; 
} 
+0

为什么倒票?没有评论?这是一个完全有效的答案(如最初提出的那样)。 – 2010-05-11 16:38:29

+1

如果有人想学习如何计算pi的值到小数点后5位,回答“3.14159”不会太有帮助,除非当他们决定要求10或100位小数时他们可以回复给你一个新的答案地方。教一个男人去钓鱼... – Dinah 2010-05-11 16:44:21

+0

@Dinah:这里实际上存在一个严重的问题,这经常被忽略,那就是你需要在高度优化之前采取微观优化,例如手工编码的汇编程序(这应该永远是最后的手段)。另外,最初提出的问题缺乏细节和背景,所以目前还不清楚提问者真的想做什么。我们当中触发人心惶惶的选民往往会错过这样的微妙点。 – 2010-05-11 16:54:30

2

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

1

没有真正的学习内联汇编。它不支持x64(使用Visual Studio,也就是说)。无论您现在使用的是x64还是未使用x64,在某些时候,您将会以内联方式使用历史记录。

更好地学习如何使用MASM,而您学习x86的地方对于x64仍然有用。

+2

最近我在网上看到很多“有什么意义”的论点。我鼓励你提出一个更好的办法,以便在OP没有意识到它们的情况下做事,但是关于“有什么意义” - 谁在乎这个“点”是什么?我甚至没有开始编写一个“点”的头脑。我做到了,因为它很有趣也很有趣。我的大多数爱好程序也没有“点”,他们只是我想要做的事情。我创造了一种深奥的编程语言,一旦做得很少。有什么意义?因为我想过要。 – Dinah 2010-05-11 16:40:04

+0

虽然内联汇编在Visual Studio中不支持64位,但汇编本身是。基本上你用C++声明函数,然后在独立的asm文件中编写asm函数并在构建应用程序时将它们链接起来。虽然这不是每个人的“内联”,但它只是另一种做同样事情的方式。这很重要 - 例如,编码VST插件的32位和64位版本(或将32位VST插件转换为64位)。这里有一个链接,看看它是如何工作的:http://www.sciencezero.org/index.php?title=How_to_write_x64_assembly_functions_in_Visual_C%2B%2B – 2012-04-19 10:59:31

0

你最好的选择是让编译器打印一个函数的汇编语言。将此用作内联汇编的基准。

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