有时我们需要分析汇编代码(IA32),而经常会遇到这样的指令:
xor ax, ax
或者使用其他寄存器:
xor dx, dx
,xor al, al
,...这样做的确切含义是什么?(ax xor ax总是得到0?)将寄存器设为0是一种常见的汇编语言习惯。
xor ax,ax
相当于 ax = ax ^ ax
,正如您已经注意到的那样,它有效地将 ax
设置为 0
。
如果我没记错的话,其主要优点是它的代码大小比mov ax,0
要小。
mov ax, 0
,但如果它可以产生更短的代码,则确实更有意义。 - Aerusxor %ax, %ax,如早前的评论所述,对应于ax = ax xor ax。这实质上将ax设置为0。此外,它还会影响/修改一些EFLAGS,例如OF、CF、SF、PF或ZF。在这种情况下,PF和ZF标志将被设置。
SF - 表示上一个操作的结果是否导致值的最高位设置为1。
PF - 表示上一个操作的结果的二进制表示中设置位数是奇数还是偶数。
ZF - 如果数学/逻辑操作的结果为零,则设置该标志;否则重置该标志。
以下示例使用GDB片段进行说明。
指令:xor %ax,%ax
"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
在“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