51

我正在组装,我一直在运行 xor,例如:

xor     ax, ax

它只是清除寄存器的值吗?

4

11 回答 11

62

A XOR B用英文翻译为“A 和 B 不相等”。所以xor ax, ax将设置ax为零,因为 ax 总是等于它自己。

A B | A XOR B
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
于 2011-01-20T16:17:45.790 回答
24

xor reg, reg常用于清除寄存器。它可以替代mov reg, 0

AFAIR,在某些情况下它更快(或更短)。

当然,XOR 本身是异或(又名:异或)操作(但在这里描述这样的基础知识是一种耻辱 - 使用维基百科)

于 2011-01-20T16:16:01.630 回答
15

xor ax, ax是将 ax 寄存器设置为 的最快方法0。在指令大小和指令数量方面最快。有关它如何工作的详细信息,您需要了解一点位算术知识。

如果两位中只有一位为 1,则两位之间的异或运算返回1;否则为 0。另一种解释方式是,如果两个位不同,则返回 1;否则为 0。

相同长度的两个二进制数之间的异或运算同样以逐位为基础进行。对两个数字进行异或运算,您会得到一个位设置为 1 的数字,其中两个操作数的对应位不同,对应位相同时为 0。

从这些知识中很容易看出,如果两个操作数相同(例如 ax 和 ax),结果将为 0。

于 2011-01-22T09:52:06.990 回答
7

xor register, register通常用于将寄存器“​​归零”,因为所有位都相互比较:

0 位保持为零。1 位变为零,因为 1 XOR 1 也是 0。

于 2011-01-20T16:16:17.777 回答
5

xor = 异或。请参阅维基百科对Exclusive or的定义。

如果您将寄存器与自身异或,它将将该寄存器归零。

0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

让我们以值 41 为例(二进制):

    101001
xor 101001
  = 000000
于 2011-01-20T16:16:29.870 回答
3
A B | XOR
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0

XOR 指令对两个操作数中的每一对位进行上述操作。0xFF xor 0xFF将会0x000x55 xor 0xAA将会如此0xFF。是的,xor ax ax清除ax

于 2011-01-20T16:15:21.633 回答
2

在这种情况下,它将清除寄存器... XOR 是“异或”...因此,如果 ax 包含 1010 而您是异或 1010,您将得到 0000(已清除)

于 2011-01-20T16:16:58.460 回答
2

如果我没记错的话xor ax, ax是一个单字节的汇编指令,而mov ax, 0至少是 3 并且可能需要稍长的时间来执行。解码肯定会比 xor 指令花费更长的时间。

于 2011-01-20T16:26:46.647 回答
2

当我很久以前开始编程时,处理器或编译器都没有独占或。当我解决它时,我坚持描述:

  • 或:如果 a=1 或 b=1 或两者都=1,则为真
  • xor:如果 a=1 或 b=1 但不是两者都=1,则为真

所以:

0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1

0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
于 2011-01-27T20:23:33.963 回答
1

它确定逻辑异或

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

因此,仅当表达式之一为真时才为 TRUE,而不是两者都为真。

于 2011-01-20T16:16:23.183 回答
1

xor ax,ax 用于将 ax 设置为 0。

原因:通常,任何处理器上的 xor 指令在汇编中占用的字节数少于使用movl 0,%ax

于 2015-02-01T00:06:45.800 回答