Assembly 寄存器归零后条件跳转的目的
我遇到了一个x86汇编程序,如下所示: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值。我指的是第一条指令和最后一条指令之间的总机器状态差异
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则没有意义。这段代码看起来很像以前的代码,因为某种原因被修改过。你在哪里遇到的?你能提供一些背景吗?