Заголовки

Оптимизация кода с помощью XOR в ассемблере

В одном из недавних докладов по ассемблеру был представлен список наиболее часто используемых команд на десктопах с процессорами x86 под управлением Linux. В числе традиционных команд, таких как mov, add и jmp, неожиданно оказалась команда xor, отвечающая за операцию «исключающего ИЛИ». Это вызывает удивление, особенно учитывая, что в прошлом, когда я работал с 6502, использование XOR указывало на шифрование или обработку графики.

Однако стоит отметить, что компиляторы часто применяют xor для присвоения регистру нуля. Например, при использовании оптимизации -O2 компилятор генерирует команду 31 c0 (xor eax, eax), тогда как при -O1 мы видим более длинную команду mov eax, 0, занимающую больше байт. Использование xor позволяет сэкономить три байта, что важно для размера программы и кэширования команд.

Кроме того, современные процессоры x86 могут оптимизировать выполнение этой команды, убирая её из очереди исполнения, что делает её выполнение практически мгновенным. Интересно, что для обнуления 64-битных регистров используется команда xor для 32-битных регистров, что также упрощает работу компиляторов. Таким образом, XOR действительно снижает объем кода и ускоряет его выполнение!