2014-11-02 4 views
1

Я заметил, что обозначение для установки регистра 0 в x86 IA32 ISA обычно выражается как:Разница между двумя инструкциями ISA ISA x86?

xorl %eax, %eax 

Я хотел бы знать, если есть разница между этими обозначениями и

movl $0, %eax 

Поскольку оба кажутся по существу делающими то же самое. Это только вопрос эффективности?

+1

'Это просто вопрос эффективности?' Да. Как правило, операционный код xor короче, в большинстве случаев он быстрее. Чтобы получить точный ответ, обратитесь к ссылке Assembly для конкретной платформы. –

+2

В основном, но «xor» влияет на флаги. Поэтому, если вам нужно сохранить флаги (это редко случается), вы не можете использовать его. – harold

ответ

2

Да, это всего лишь вопрос эффективности. Intel рекомендует использовать xorl over movl, потому что его процессоры признают, что результат регистрации регистра с самим собой всегда равен 0 - это не зависит от того, что изначально было в регистре (See section 3.5.1.8). Это позволяет освободить регистр от независимой операции в отношении других инструкций и может увеличить параллелизм и производительность на уровне инструкций. Intel не обещает, что Movl имеет этот объект.

+0

'movl' не зависит от предыдущего значения – harold

+0

Правда, но процессор Intel x86 этого не знает. –

+0

Конечно. Когда он регистрирует бизнес переименования регистров, он не видит входного регистра, поэтому никакой зависимости. Если это не 8 или 16 бит 'mov', но это' movl'. Тем не менее, 'xor' все еще быстрее, поскольку он даже не выполняется. – harold

Смежные вопросы