【问题标题】:why logical"NOT" the condition in if statement in assembly?为什么在汇编中的 if 语句中逻辑“不是”条件?
【发布时间】:2018-09-17 13:08:48
【问题描述】:

我正在学习汇编,一本教科书展示了条件控制的示例:

我不明白为什么在第3行使用x>=y,为什么不按照逻辑使用x<y(与原始C代码相同)?是否有任何特殊原因!(不是)if 语句中的条件?

【问题讨论】:

  • 请将代码显示为文字,而不是图片...
  • @m0skit0: jgejle 在所有 x86 CPU 上具有相同的性能。显而易见的原因是if(x){ do stuff; } 是通过对do stuff 的直通实现的,或者是在相反条件上的条件跳转。
  • 我看不到图片。
  • 原来的if/else代码有两个分支,生成的asm也有两个分支,每个分支都有相同的条件触发器。是否使用<>= 在数学上是相等的(当然还有正确的其他分支)。编译器必须选择一个,并且这段代码似乎没有提供任何提示哪个分支会更“热”,所以在这种情况下它几乎是随机的,也许它会保持原始源的顺序,即“ if”分支是第一个(所以条件跳转需要“else”条件)。或者它只是在评估树中首先点击了该选项。
  • 投反对票,因为您的代码在图片中。一旦你解决了这个问题,我将收回反对票。

标签: c assembly compilation goto instruction-set


【解决方案1】:

if() 语句的意思是“如果条件不成立则跳过”。

如果条件为真,您希望执行落入if 主体,如果条件为假,您希望执行跳过if 主体。

因此,编译if 的明显/字面方法是在逆条件下使用jcc,例如jnl。 (对于那些高度相关的 if/else 块,优化后的代码当然可以做得更好,比如减法和条件否定。)

如果你想使用jl,你必须把if-body 放在行外,可能在函数末尾的ret之后,然后再跳回去。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多