归零寄存器后的条件跳转的目的

时间:2017-01-04 01:01:46

标签: assembly compilation x86

我遇到了一块像这样的x86汇编程序:

  push eax
  xor eax, eax
  je label1
  add esp, 4
label1:
  pop eax

据我所知,xor指令将始终保留ZF设置,这反过来使je始终触发。这段代码是否等同于nop? 编译器会生成这个吗?如果是,为什么?

1 个答案:

答案 0 :(得分:2)

直接回答您的问题:

  

这段代码是否等同于nop

没有。它会更改标记(xor eax,eax),并且会将[esp-4]的内存设置为原始eax值。 (我的意思是第一个和最后一个指令之间的总机器状态差异)

另外,它在内存中形成与其他形式的nop不同的操作码(如果这些操作码也被读作其他地方的数据,例如校验和作为反篡改措施等)。

并且内部CPU状态可能比nop修改得更多,一些分支预测数据很可能因je而发生变化,并且内存写入堆栈区域可能已触发进一步更改缓存状态(不太可能,因为该部分内容可能被这部分指令广泛使用)。它的时间与nop不同。

  

编译器会生成这个吗?如果是,为什么?

我不这么认为,标记很少被编译器用于更大量的指令,并且在不稳定的堆栈区域设置内存move [esp-4],eax将被使用,但首先,编译器不太可能需要在那里设定价值。