x86汇编中XOR的含义是什么?

Chi*_*ins 36 assembly xor

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

xor     ax, ax
Run Code Online (Sandbox Code Playgroud)

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

orl*_*rlp 48

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
Run Code Online (Sandbox Code Playgroud)

  • @TheRookierLearner:`XOR B`是高级构造的原始构建块.它*可用于实现`(A!= B)`,但它本身就是一个截然不同的操作.此外,当你从布尔零/非零视角查看结果时,夜间骇客声明"英语中的异或B"将被翻译为"A和B不相等"的说法是正确的.XOR的一个流行应用是切换某个输入位域的一个或多个位:"A XOR 1"的结果只是A的低位的反转. (5认同)

Luk*_*asz 19

xor reg, reg通常用于清除注册.它可以替代mov reg, 0

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

当然,XOR本身就是eXclusive OR(又名:独占分离)操作(但是在这里描述这样的基础是一种耻辱 - 使用维基百科)


Sal*_*n A 12

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

如果两个位中的一个且仅两个中的一个为1,则两位之间的XOR操作返回1; 否则为0.另一种解释方法是,如果两个位不同,则返回1; 否则为0.

两个相同长度的二进制数之间的XOR运算同样在逐位的基础上工作.XOR两个数字得到一个数字,其中位设置为1,其中两个操作数的相应位不同,0当相应的位相同时.

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

  • 在 32 位或 64 位模式下,使用“xor eax, eax”将 ax 归零会更快。编码更短,并且不会错误地依赖于上 16b 的先前值。在现代 CPU 上的 16b 模式下,可能 `xor eax,eax` 仍然更好,因为[使用公认的归零习惯用法有许多特殊好处](http://stackoverflow.com/questions/33666617/which-is-在 x86 程序集 xor-mov-or-and/33668295#33668295 中将寄存器设置为零的最佳方法) (2认同)

小智 6

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

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


jwe*_*ich 5

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

如果你对一个寄存器进行异或,它会将该寄存器归零。

0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Run Code Online (Sandbox Code Playgroud)

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

    101001
xor 101001
  = 000000
Run Code Online (Sandbox Code Playgroud)