9

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 ?)

Aerus
  • 4,332
  • 5
  • 43
  • 62
  • 1
    http://stackoverflow.com/questions/33666617/which-is-best-way-to-set-a-register-to-zero-in-x86-assembly-xor-mov-or-and (xor is the best way) – Peter Cordes Nov 28 '15 at 07:35

3 Answers3

19

It's a common assembler idiom to set a register to 0.

xor ax, ax corresponds to ax = ax ^ ax which, as you already noticed, is effectively ax = 0.

If I recall correctly the main advantage is that its code-size is smaller than mov ax, 0

CodesInChaos
  • 106,488
  • 23
  • 218
  • 262
  • Thanks, i imagined it had to be something different than setting it to 0 since i would use `mov ax, 0` for that but if it produces a shorter code-size it makes more sense indeed. – Aerus Nov 20 '11 at 13:13
2

That is exactly what it does -- zero the contents of a register

Anthony Blake
  • 5,328
  • 2
  • 25
  • 24
1

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
scanjee
  • 311
  • 3
  • 5
  • Welcome to SO. This answer is more detailed than is useful, IMO. You don't need to explain how all the flags work in answer to a question about a zeroing idiom. It would be enough to leave a comment pointing out that unlike `mov reg, 0`, xor affects the flags. Since your answer popped this question onto the recent-activity front page, I ended up leaving a comment to a question with a link to a much more detailed answer about why xor is the best way to zero regs. (Where I mentioned that in most cases, do the zeroing before the instruction whose flag-results you want.) – Peter Cordes Nov 28 '15 at 07:41
  • Thanks.. I agree it has more detail than needed. I noticing it now. – scanjee Nov 28 '15 at 18:46