Миоко Таканава
Гений
(51598)
11 лет назад
Это не коды, а мнемоники инструкций процессоров семейства i80x86.
Обе эти инструкции используются для обнуления регистра eax.
mov eax, 0 просто загружает в регистр ноль.
xor eax, eax выполняет над содержимым регистра операцию поразрядное исключающее или или по-другому функцию XOR. Если соответствующие разряды операндов равны, то результирующий бит будет равен нулю. А так как оба операнда - один и тот же регистр (eax := eax XOR eax), то в результате получится 32-разрядный ноль, как и в случае с mov.
Разница между этими командами:
- в размере кода: mov eax, 0 на три байта длиннее, чем xor eax, eax.
- в оказываемом влиянии на регистр флагов процессора: mov не изменяет никакие флаги, xor сбрасывает CF, AF, SF и устанавливает ZF и PF.
- во времени выполнения команды: mov и xor выполняются разное количество тактов, но на современных суперскалярных процессорах эта разница сходит на нет. Обе инструкции полностью выполнятся, находясь ещё в самом начале конвейера.
Чаще используется xor eax, eax просто потому что она короче и по старой привычке, так как когда-то давно она выполнялась быстрее mov.
mov eax, 0 используют, когда необходимо сохранить состояния флагов после выполнения предыдущей операции.
Кстати, компиляторы с языков высокого уровня, даже оптимизирующие, для обнуления регистра в подавляющем большинстве случаев вставят инструкцию mov eax, 0.