Итак, я изучал 12 главу учебника picoCTF и внезапно увидел разницу в моей сборке программы и picoCTF в конце основной функции, где проверяется канарейка стека.
Их xor rdx,QWORD PTR fs:0x28
и мой sub rdx,QWORD PTR fs:0x28
У меня процессор AMD и моя сборка использует инструкцию sub для проверки равенства, но в их сборке есть xor. Я понимаю, он делает то же самое, но почему именно так? Разве операция xor не более эффективна и даже не из-за процессора?
@TimRoberts, окей, спасибо за объяснение эффективности!
xor
вместо sub
была неудачная оптимизация, исправленная в GCC10 после того, как я сообщил об этом. gcc.gnu.org/bugzilla/show_bug.cgi?id=90568 . (Они не обязательно равны, @TimRoberts, потому что мы все еще не используем процессоры 486. Intel, начиная с Sandybridge, может объединить макросы sub/jcc
в один моп, но не может для xor
. Последние процессоры AMD могут делать то же самое. Но да, sub
хуже некуда.)
Раньше использовался GCC xor
, GCC10 и более поздние версии использовали sub
после того, как я предложил эту оптимизацию: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90568
Это не зависит от -mtune=znver3
или чего-то ещё, просто версия GCC.
Семейство Intel Sandybridge может макросливатьsub/jcc
в один моп, но не может xor
.
На других процессорах sub
и xor
в этом случае имеют одинаковую производительность, так что это победа для этого семейства процессоров Intel без каких-либо недостатков где-либо еще.
AMD Zen 3 и более поздние версии могут использовать сабвуфер или xor.
Раньше AMD могла объединять только test
и cmp
.
Это не более чем личное предпочтение. Оба были операциями за 1 цикл, начиная с 486, и оба влияют на все флаги.