我遇到了一块像这样的x86汇编程序:
push eax
xor eax, eax
je label1
add esp, 4
label1:
pop eax
据我所知,xor
指令将始终保留ZF设置,这反过来使je
始终触发。这段代码是否等同于nop
?
编译器会生成这个吗?如果是,为什么?
答案 0 :(得分:2)
直接回答您的问题:
这段代码是否等同于
nop
?
没有。它会更改标记(xor eax,eax
),并且会将[esp-4]
的内存设置为原始eax
值。 (我的意思是第一个和最后一个指令之间的总机器状态差异)
另外,它在内存中形成与其他形式的nop
不同的操作码(如果这些操作码也被读作其他地方的数据,例如校验和作为反篡改措施等)。
并且内部CPU状态可能比nop
修改得更多,一些分支预测数据很可能因je
而发生变化,并且内存写入堆栈区域可能已触发进一步更改缓存状态(不太可能,因为该部分内容可能被这部分指令广泛使用)。它的时间与nop
不同。
编译器会生成这个吗?如果是,为什么?
我不这么认为,标记很少被编译器用于更大量的指令,并且在不稳定的堆栈区域设置内存move [esp-4],eax
将被使用,但首先,编译器不太可能需要在那里设定价值。