我们不时要分析汇编代码(IA32), 而且我经常遇到一个看起来像这样的指令:
xor ax, ax
或与其他寄存器一样:xor dx, dx
,xor al, al
,...
这到底是做什么的? (ax xor ax总是给0?)
答案 0 :(得分:13)
将寄存器设置为0是一种常见的汇编语言。
xor ax, ax
对应于ax = ax ^ ax
,正如您已经注意到的那样,ax = 0
实际上是mov ax, 0
。
如果我没记错,主要优点是其代码大小小于{{1}}
答案 1 :(得分:2)
这正是它的作用 - 将寄存器的内容归零
答案 2 :(得分:1)
xor%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