所以我一直在探索 picoCTF 入门 中的第 12 章,突然发现我的程序汇编和主函数末尾的 picoCTF 的差异,其中正在检查堆栈金丝雀。 他们的是
xor rdx,QWORD PTR fs:0x28
,我的是sub rdx,QWORD PTR fs:0x28
我有 AMD 处理器,我的程序集使用 sub 指令来检查相等性,但在他们的程序集中有异或。我明白,它做同样的事情,但为什么会这样呢?异或运算不是更高效吗?甚至是因为处理器的原因?
xor
而不是 sub
是一个错过的优化,在我报告后在 GCC10 中修复。 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90568
英特尔 Sandybridge 系列可以将
sub/jcc
宏融合到单个微指令中,但不能用于 xor
。
在其他 CPU 上,
sub
和 xor
的性能相同。
sub
或 xor
。