From time to time we have to analyze pieces of assembler code (IA32), and more than often i come across an instruction that looks like this:
xor ax, ax
or with other registers aswell: xor dx, dx
, xor al, al
, ...
What exactly does this do ? (ax xor ax always gives 0 ?)
It's a common assembler idiom to set a register to 0.
xor ax, ax
corresponds to ax = ax ^ ax
which, as you already notices, is effectively ax = 0
.
If I recall correctly the main advantage is that its code-size is smaller than mov ax, 0
That is exactly what it does -- zero the contents of a register
xor %ax, %ax, as stated in earlier comments corresponds to ax = ax xor ax. This essentially set ax = 0. In addition, it also affects/modifies some of the EFLAGS such as OF, CF, SF, PF or ZF. In this case, PF and ZF flags will be set.
SF - Indicates whether the result of the last operation resulted in a value whose most significant bit is set to 1.
PF - Indicates if the number of set bits is odd or even in the binary representation of the result of the last operation.
ZF - It is set if the result of the mathematical/logical operation is zero or reset otherwise.
Example is shown below using GDB snippets.
Instruction: xor %ax,%ax
Before "xor"
(gdb) info registers
eax 0xaa55 43605
ecx 0x0 0
edx 0x80 128
ebx 0x0 0
esp 0x6f20 0x6f20
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x7c02 0x7c02
eflags 0x2 [ ]
cs 0x0 0
ss 0x0 0
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
After "xor"
(gdb) info registers
eax 0x0 0 --------------------> AX = 0
ecx 0x0 0
edx 0x80 128
ebx 0x0 0
esp 0x6f20 0x6f20
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x7c04 0x7c04
eflags 0x46 [ PF ZF ] --------------------> Flags Set
cs 0x0 0
ss 0x0 0
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
来源:https://stackoverflow.com/questions/8201676/xor-register-register-assembler