2011-11-20 187 views
6

不时我们要分析的汇编代码段(IA32), 超过我常常遇到,看起来像这样的指令:XOR寄存器,寄存器(汇编)

xor ax, ax 

或其他寄存器也如此:xor dx, dxxor al, al,...

这到底是什么? (斧斧XOR总是给人0?)

+0

复制后前http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax – mark4o

+0

http://stackoverflow.com/questions/33666617/which-is-best-way-to-set-a-register-to-zero-in -x86-assembly-xor-mov-or-and(xor是最好的方法) –

回答

13

这是一个常见的汇编成语寄存器设置为0。

xor ax, ax对应ax = ax^ax其中,因为你已经通知,是有效ax = 0

如果我没有记错的主要优点是,它的代码尺寸小于mov ax, 0

+0

谢谢,我im因为我会使用'mov ax,0',但是如果它产生更短的代码量,它确实会更有意义。 – Aerus

2

这正是它 - 零寄存器

1

XOR%斧,斧%的内容,正如前面的评论所述,对应于ax = ax xor ax。这基本上设置ax = 0。另外,它还影响/修改一些EFLAGS,如OF,CF,SF,PF或ZF。在这种情况下,PF和ZF标志将被设置。

SF - 表示上次操作的结果是否导致其最显著位被设置为1。

PF的值 - 表示组的位的数目是奇数还是偶数中的二进制表示最后一次操作的结果。

ZF - 如果数学/逻辑运算的结果为零或否则复位,则置位。

示例如下所示,使用GDB片段。

指令: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 

“异或”

(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 
+0

欢迎来到SO。这个答案比IMO更有用。你不需要解释所有的标志如何回答关于归零习惯的问题。留下一条评论指出,与'mov reg,0'不同,xor会影响标志。既然你的回答将这个问题提到了最近的活动头版,我最后留下了一个问题的评论,并附有关于为什么xor是零注册最佳方式的更详细答案的链接。 (在我提到的情况下,在大多数情况下,在你想要的标志结果指令之前进行调零。) –

+0

谢谢..我同意它有比需要更多的细节。我现在注意到它。 – scanjee