Gcc 插入良性指令会挂起程序
我正在测试一段汇编代码,我注意到了以下有趣的现象: 原大会:Gcc 插入良性指令会挂起程序,gcc,assembly,instrumentation,gnu-assembler,dwarf,Gcc,Assembly,Instrumentation,Gnu Assembler,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
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 #,
仪表化组件:
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
后,程序挂起(就像有一个死循环)。我不明白添加的有什么意义,所以我试着把它放在其他地方。有趣的是,我发现每当它被添加到带有鉴别器1的节之后时,就会出现一些错误。有什么想法吗?读了一篇文章后,我无法完全理解鉴别器。我将继续阅读
有什么想法吗?一般来说,你不能简单地将指令添加到现有的程序集列表中,并希望一切都能像以前一样顺利进行。例如,添加的指令可能会修改某些体系结构状态,从而更改以下指令的行为
在您的特定示例中,addq
指令将覆盖先前由cmpl
指令设置的标志,因此条件jg
将做错误的事情(在您的情况下永远循环)。您完全正确。因此,我正在研究如何正确添加所需的说明。我在哪里可以找到有关哪些标志被哪些标志修改的信息?我想《英特尔手册》就是其中之一。《英特尔软件开发人员指南》当然是一个地方,但《There on SO》还有很多其他好的链接,包括比1000多页的《英特尔指南》更紧凑的参考。顺便说一句,lea
指令允许您添加两个寄存器(以及更多寄存器)不修改标志。将签出。实际上,我只需要向寄存器添加一个立即值。有合适的人选吗?lea
也可以添加即时消息。