【问题标题】:Are there any performance disadvantages of using .if and .elseif in assembly?在汇编中使用 .if 和 .elseif 是否有任何性能劣势?
【发布时间】:2011-05-03 13:57:02
【问题描述】:

我想知道与使用一系列 cmpjmp 语句相比,.if.elseif 指令是否有任何性能劣势。

谢谢!

Devjeet

【问题讨论】:

    标签: performance assembly masm


    【解决方案1】:

    总的来说,没有性能劣势。

    但是,如果您决定一直使用它们,您可能应该不时检查一下生成的汇编程序,以更好地了解它们对您的代码所做的事情。在极少数情况下,生成的代码效率会稍低。

    【讨论】:

      【解决方案2】:

      你更有可能写一个更糟糕的 .if 你自己。例如,“.IF eax==0”被评估为:

      test    eax,eax
      jnz     label
      

      没有比这更好的了。

      【讨论】:

      • 实际上 .if 是更有经验的方法 :) 当您可以使用 masm 指令时,您应该无论如何都应该这样做。这将创建更好的代码。我建议你仔细看看 Masm 的伟大指令。除其他外,调用和宏是编写良好 masm 代码的非常重要的方法。
      • 上面的代码可能不是最优的。如果您之前对 eax 进行过算术运算,例如“add eax, ebx”,则不需要“test eax, eax”。 '.if' 隐藏了这一点,通常应避免使用。
      • 对于你给出的答案:你写了“它不能比这更好”。如果我们同意在这种情况下“更好”意味着“具有相同语义的更短或更快的代码”,那么您的陈述是错误的,因为在某些情况下可能会省略测试指令并且不使用 '.if' 将是“更好” .现在您可能会争辩说“更好”突然意味着“更具可读性和更易于维护”,但这种情况下我根本不会使用汇编;-)
      • 请注意,该问题明确指出了“性能”。此外,用两条装配线回答“它不能变得更好”似乎表明你很清楚这一点。但不幸的是,在这种情况下,您的陈述是错误的,所以当然 now 它根本与性能无关,仅与可读性有关 :-) 对于代码:将其设为 sub eax,2(可以是用作比较 eax==2,您希望保留差异)后跟 .if eax==0。只需在随机页面上阅读该代码(如果您使用 google masm ".if",则可以看到第四个结果
      • 最后一句话:我已经阅读了你所有的 cmets 并将阅读未来的 cmets,如果你决定做一些,因为我总是有兴趣学习新的东西。但我不会进一步评论,因为它已经离题了:请注意,无论是召唤一些九年没有更新他的网站并声称他是无与伦比的大师,还是使用 CAPS LOCK 对你的情况都有帮助。但是删除“它不能比这更好”,反对票就会消失:-)或者如果你愿意,也可以反对我最好的一些 asm 答案,但是阅读它们,你甚至可能学到一些东西 ;-)
      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      相关资源
      最近更新 更多