В одном из моих докладов по ассемблеру я представил список из 20 наиболее часто используемых команд в среде x86 с Linux. Среди них оказалась команда xor, что стало неожиданностью. В прошлом, когда я занимался хакингом на 6502, XOR указывал на наличие кода, связанного с шифрованием. Однако на современных машинах с Linux эта команда выполняется в значительных количествах.
Компиляторы часто используют xor для обнуления регистров, например, в коде int main() { return 0; }. При компиляции с оптимизацией -O2, результатом будет 31 c0 xor eax, eax, что занимает всего два байта. В отличие от более понятной команды mov eax, 0, которую занимает пять байт.
Это позволяет экономить место и увеличивает эффективность кэширования. Кроме того, процессоры x86 оптимизируют выполнение xor, что делает его выполнение практически мгновенным. Интересно, что xor eax, eax обнуляет все 64 бита, хотя его 64-битная версия xor rax, rax не так часто встречается из-за особенностей обработки регистров.
Таким образом, использование команды xor не только экономит байты, но и ускоряет выполнение программ. Благодарим компиляторы за такой умный подход!