Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 插入良性指令会挂起程序_Gcc_Assembly_Instrumentation_Gnu Assembler_Dwarf - Fatal编程技术网

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
也可以添加即时消息。