Какова цель фиксации регистра с самим собой? [дубликат]
этот вопрос уже есть ответ здесь:
- Что является лучшим способом, чтобы установить регистр в ноль в ассемблере для x86: операции XOR, MOV или и? 1 ответ
xor eax, eax
всегда будет ставить eax
к нулю, верно? Итак, почему MSVC++ иногда помещает его в мой исполняемый код? Это более эффективно, что mov eax, 0
?
012B1002 in al,dx
012B1003 push ecx
int i = 5;
012B1004 mov dword ptr [i],5
return 0;
012B100B xor eax,eax
кроме того, что значит ли это сделать in al, dx
?
7 ответов:
Да, это более эффективно.
операции короче, чем
mov eax, 0
, всего 2 байта, и процессор распознает особый случай и обрабатывает его какmov eax, 0
без ложной зависимости чтения отeax
, Так что время выполнения то же самое.
также, чтобы избежать 0s при компиляции, как используется в кодах оболочки для эксплуатации переполнения буфера и т. д. Почему не от 0 ? Ну, 0 представляет собой конец строки в c / C++, и код оболочки будет усечен, если среднее значение эксплуатации является функцией обработки строк или тому подобное.
кстати, я имею в виду исходный вопрос: "есть ли причина делать "xor eax, eax"?"не то, что делает компилятор MSVC++.
Так как есть некоторые дебаты в комментариях о том, как это происходит уместно в реальном мире, см. в этой статье и этот раздел в Википедии.
xor eax, eax
более быстрый способ установкиeax
к нулю. Это происходит потому, что вы возвращаете ноль.The
in
инструкция делает вещи с портами ввода / вывода. В основном чтение Слова данных из указанного портаdx
и хранить его вal
. Непонятно, почему это происходит. Вот это ссылка это, кажется, объясняет это в деталях.
операция XOR действительно очень быстрая. Если результатом является установка регистра в ноль, компилятор часто делает это самым быстрым способом, который он знает. Битовая операция, такая как XOR, может занять только один цикл процессора, тогда как копия (из одного регистра в другой) может занять небольшую горстку.
часто составители компиляторов даже будут иметь разное поведение при разных целевых архитектурах ЦП.
еще одна причина, чтобы использовать
XOR reg, reg
илиXORPS reg, reg
- это разрыв цепочек зависимостей, что позволяет процессору оптимизировать параллельное выполнение команд сборки более эффективно (даже это добавляет еще несколько предварительных настроек пропускной способности команд).
из OP > любая причина делать "xor eax,eax" возвращает 0; 012B100B xor eax, eax ret
XOR EAX, EAX просто 0 из регистра EAX, он выполняется быстрее, чем a MOV EAX,$0 и не нужно извлекать немедленные данные 0 для загрузки в eax
Это очень очевидно, что это" возврат 0", что MSVC оптимизирует EAX-это регистр, используемый для возврата значения из функции в MSVC
xor часто используется для шифрования кода, например
mov eax,[ecx+ValueHere] xor eax,[ecx+ValueHere] mov [ebx+ValueHere],esi xor esi,[esp+ValueHere] pop edi mov [ebx+ValueHere],esi
инструкция XOR соединяет два значения с помощью логического исключения или запоминания или использует inclusive или чтобы лучше понять XOR, рассмотрим эти два двоичных значения:
1001010110 0101001101
Если вы или они, результат 1100011011, когда два бита друг на друга равны, результирующий бит равен 0. В противном случае результирующий бит равен 1. Вы можете использовать калькулятор.exe для вычисления XOR.