Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly 寄存器归零后条件跳转的目的_Assembly_Compilation_X86 - Fatal编程技术网

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

Assembly 寄存器归零后条件跳转的目的,assembly,compilation,x86,Assembly,Compilation,X86,我遇到了一个x86汇编程序,如下所示: push eax xor eax, eax je label1 add esp, 4 label1: pop eax 据我所知,xor指令将始终离开ZF集合,这反过来使je始终启动。这段代码等同于nop吗? 编译器会生成这个吗?如果是,为什么?要直接回答您的问题: 这段代码等同于nop吗 否。它确实通过xor eax、eax更改标志,并且将[esp-4]处的内存设置为原始eax值。我指的是第一条指令和最后一条指令之间的总机器状态差异

我遇到了一个x86汇编程序,如下所示:

  push eax
  xor eax, eax
  je label1
  add esp, 4
label1:
  pop eax
据我所知,xor指令将始终离开ZF集合,这反过来使je始终启动。这段代码等同于nop吗?
编译器会生成这个吗?如果是,为什么?

要直接回答您的问题:

这段代码等同于nop吗

否。它确实通过xor eax、eax更改标志,并且将[esp-4]处的内存设置为原始eax值。我指的是第一条指令和最后一条指令之间的总机器状态差异

此外,它在内存中形成与其他形式的nop不同的操作码,以防这些操作码也在其他地方作为数据读取,例如校验和作为防篡改措施等

内部CPU状态可能比nop修改得更多,一些分支预测数据很可能由于je而发生更改,并且内存写入堆栈区域可能触发缓存状态的进一步更改,因为该部分内存可能被该部分周围的指令广泛使用。它将有不同的时间比nop

编译器会生成这个吗?若有,原因为何


我不这么认为,编译器很少在较大数量的指令上使用标志,为了在不稳定的堆栈区域中设置内存,可以使用move[esp-4],eax,但首先编译器不太可能需要在那里设置值。

可能有其他代码直接跳到je或add指令,跳过xor。但是看起来不太可能,而且某些高级语言编译器也不太可能生成这样的代码。@Ped7g不,没有其他代码跳转到这个代码段中。那么从执行的角度来看,它是无用的。它可能仍然通过指令操作码形成一些二进制数据,因此可能其他部分正在将这些xor/je/add指令作为数据读取。这也可能是后来其他人在没有源代码的情况下修改代码的结果。或者不管怎样,很难说——在汇编中,整个二进制和目标平台形成了完整的上下文。您可能遗漏了一些小细节。与xor eax、eax、a或eax后的je不同,eax是有意义的,但其余的添加esp、4和pop eax则没有意义。这段代码看起来很像以前的代码,因为某种原因被修改过。你在哪里遇到的?你能提供一些背景吗?