What is the purpose of XORing a register with itself?
xor eax, eax
is a faster way of setting eax
to zero. This is happening because you're returning zero.
The in
instruction is doing stuff with I/O ports. Basically reading a word of data from the port specified dx
in and storing it in al
. It's not clear why it is happening here. Here's a reference that seems to explain it in detail.
Yes, it is more efficient.
The opcode is shorter than mov eax, 0
, only 2 bytes, and the processor recognizes the special case and treats it as a mov eax, 0
without a false read dependency on eax
, so the execution time is the same.
Also to avoid 0s when compiled as used on shell codes for exploitation of buffer overflows, etc. Why avoid the 0 ? Well, 0 represents the end of string in c/c++ and the shell code would be truncated if the mean of exploitation is a string processing function or the like.
Btw im referring to the original question: "Any reason to do a “xor eax, eax”?" not what the MSVC++ compiler does.
Since there's some debate in the comments about how this is pertinent in the real world, see this article and this section on Wikipedia.