Ответ 1
Да, это более эффективно.
Операционный код короче mov eax, 0
, всего 2 байта, и процессор распознает специальный случай и рассматривает его как mov eax, 0
без ложной зависимости чтения от eax
, поэтому время выполнения такое же.
xor eax, eax
всегда будет устанавливать eax
на ноль, правильно? Итак, почему MSVС++ иногда помещает его в мой исполняемый код? Насколько эффективнее 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
?
Да, это более эффективно.
Операционный код короче mov eax, 0
, всего 2 байта, и процессор распознает специальный случай и рассматривает его как mov eax, 0
без ложной зависимости чтения от eax
, поэтому время выполнения такое же.
Кроме того, чтобы избежать 0s при компиляции, как используется для кодов оболочки для использования переполнения буфера и т.д. Почему бы избежать 0? Ну, 0 представляет конец строки в c/С++, и код оболочки будет усечен, если среднее из функции использования является функцией строковой обработки или тому подобное.
Btw im, ссылаясь на исходный вопрос: "Любая причина сделать" xor eax, eax "?" не то, что делает компилятор MSVС++.
Поскольку в комментариях о том, как это уместно в реальном мире, есть некоторые споры, см. в этой статье и этот раздел в Википедии.
xor eax, eax
- это более быстрый способ установки eax
в ноль. Это происходит потому, что вы возвращаете нуль.
Инструкция in
выполняет операции с портами ввода/вывода. В основном, прочитав слово данных из порта, указанного dx
и сохранив его в al
. Непонятно, почему это происходит здесь. Здесь ссылка, которая, кажется, объясняет это подробно.
Другой причиной использования XOR reg, reg
или XORPS reg, reg
является разрыв цепочек зависимостей, что позволяет ЦП оптимизировать параллельное выполнение команд сборки более эффективно (даже если он добавляет еще несколько предварительных инструкций по пропускной способности).
из OP > любая причина делать "xor eax, eax" return 0; 012B100B xor eax, eax ret < - OP не показывает это
XOR EAX, EAX просто 0 из регистра EAX, он выполняется быстрее, чем 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 соединяет два значения с использованием логического исключения ИЛИ помнит ИЛИ использует включительно ИЛИ Чтобы лучше понять XOR, рассмотрите эти два двоичных значения:
1001010110
0101001101
Если вы их ИЛИ, результат равен 1100011011. Когда два бита друг над другом равны, результирующий бит равен 0. Еще один результат: 1. Вы можете использовать calc.exe для вычисления XOR.