检测良性指令会使程序挂起

时间:2016-10-05 02:55:49

标签: gcc assembly instrumentation gas dwarf

我正在研究装配代码,我注意到以下有趣的现象:

原始集会:

  64     .loc 1 22 0 is_stmt 0 discriminator 1
  65     cmpl    $31, -4(%rbp)   #, i
  66     jg  .L2 #,

仪表化装配:

  64     .loc 1 22 0 is_stmt 0 discriminator 1
  65     cmpl    $31, -4(%rbp)   #, i
  66     addq    $15, %r15
  67     jg  .L2 #,

首先,程序集的任何其他部分都不使用r15(由gcc --fixed-r15确保)。 添加单个addq后,程序挂起(就像有一个死循环)。我不明白add的重要性是什么,所以我试着把它放在其他地方。有趣的是,我发现无论何时在 discriminator 1 的部分之后添加,都会出现一些错误。任何的想法?在阅读this之后,我无法完全理解discriminator。会继续阅读。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

通常,您不能简单地指令添加到现有的装配清单中,并希望一切都能像以前一样完成。例如,添加的指令可以修改一些改变以下指令行为的架构状态。

在您的特定示例中,addq指令将覆盖先前由cmpl指令设置的标志,因此条件jg将执行错误操作(在您的情况下永远循环) )。

相关问题