我正在研究装配代码,我注意到以下有趣的现象:
原始集会:
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
。会继续阅读。
有什么想法吗?
答案 0 :(得分:3)
通常,您不能简单地将指令添加到现有的装配清单中,并希望一切都能像以前一样完成。例如,添加的指令可以修改一些改变以下指令行为的架构状态。
在您的特定示例中,addq
指令将覆盖先前由cmpl
指令设置的标志,因此条件jg
将执行错误操作(在您的情况下永远循环) )。