XOR寄存器,寄存器(汇编)
不时我们要分析的汇编代码段(IA32), 超过我常常遇到,看起来像这样的指令:XOR寄存器,寄存器(汇编)
xor ax, ax
或其他寄存器也如此:xor dx, dx
,xor al, al
,...
这到底是什么? (斧斧XOR总是给人0?)
这是一个常见的汇编成语寄存器设置为0。
xor ax, ax
对应ax = ax^ax
其中,因为你已经通知,是有效ax = 0
。
如果我没有记错的主要优点是,它的代码尺寸小于mov ax, 0
谢谢,我im因为我会使用'mov ax,0',但是如果它产生更短的代码量,它确实会更有意义。 – Aerus
这正是它 - 零寄存器
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
欢迎来到SO。这个答案比IMO更有用。你不需要解释所有的标志如何回答关于归零习惯的问题。留下一条评论指出,与'mov reg,0'不同,xor会影响标志。既然你的回答将这个问题提到了最近的活动头版,我最后留下了一个问题的评论,并附有关于为什么xor是零注册最佳方式的更详细答案的链接。 (在我提到的情况下,在大多数情况下,在你想要的标志结果指令之前进行调零。) –
谢谢..我同意它有比需要更多的细节。我现在注意到它。 – scanjee
复制后前http://*.com/questions/1396527/any-reason-to-do-a-xor-eax-eax – mark4o
http://*.com/questions/33666617/which-is-best-way-to-set-a-register-to-zero-in -x86-assembly-xor-mov-or-and(xor是最好的方法) –