Какова цель XORing регистрации с собой?

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?

Ответ 1

Да, это более эффективно.

Операционный код короче mov eax, 0, всего 2 байта, и процессор распознает специальный случай и рассматривает его как mov eax, 0 без ложной зависимости чтения от eax, поэтому время выполнения такое же.

Ответ 2

Кроме того, чтобы избежать 0s при компиляции, как используется для кодов оболочки для использования переполнения буфера и т.д. Почему бы избежать 0? Ну, 0 представляет конец строки в c/С++, и код оболочки будет усечен, если среднее из функции использования является функцией строковой обработки или тому подобное.

Btw im, ссылаясь на исходный вопрос: "Любая причина сделать" xor eax, eax "?" не то, что делает компилятор MSVС++.

Поскольку в комментариях о том, как это уместно в реальном мире, есть некоторые споры, см. в этой статье и этот раздел в Википедии.

Ответ 3

xor eax, eax - это более быстрый способ установки eax в ноль. Это происходит потому, что вы возвращаете нуль.

Инструкция in выполняет операции с портами ввода/вывода. В основном, прочитав слово данных из порта, указанного dx и сохранив его в al. Непонятно, почему это происходит здесь. Здесь ссылка, которая, кажется, объясняет это подробно.

Ответ 4

Другой причиной использования XOR reg, reg или XORPS reg, reg является разрыв цепочек зависимостей, что позволяет ЦП оптимизировать параллельное выполнение команд сборки более эффективно (даже если он добавляет еще несколько предварительных инструкций по пропускной способности).

Ответ 5

из 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

Ответ 6

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.