Какова цель фиксации регистра с самим собой? [дубликат]


этот вопрос уже есть ответ здесь:

  • Что является лучшим способом, чтобы установить регистр в ноль в ассемблере для 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 97

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.