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

Assembly XOR在x86汇编中的含义是什么?,assembly,xor,Assembly,Xor,我正在进入汇编阶段,我一直在运行xor,例如: xor ax, ax 它只是清除寄存器的值吗 A B | XOR 0 0 | 0 1 0 | 1 0 1 | 1 1 1 | 0 XOR指令对两个操作数中的每对位执行上述操作。因此0xFF xor 0xFF将是0x00,0x55 xor 0xAA将是0xFF。是的,xor ax ax清除axxor reg,reg通常用于清除寄存器。它可以作为mov reg,0 在某些情况下,它更快(或更短) 当然,异或本身就是异或(又称异或析取)运算(

我正在进入汇编阶段,我一直在运行xor,例如:

xor     ax, ax
它只是清除寄存器的值吗

A B | XOR
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0

XOR指令对两个操作数中的每对位执行上述操作。因此
0xFF xor 0xFF
将是
0x00
0x55 xor 0xAA
将是
0xFF
。是的,
xor ax ax
清除
ax
xor reg,reg
通常用于清除寄存器。它可以作为
mov reg,0

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


当然,异或本身就是异或(又称异或析取)运算(但在这里描述这样的基础是很遗憾的——使用维基百科)

异或寄存器,寄存器
通常用于“置零”寄存器,因为所有位都是相互比较的:

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

它确定逻辑异或

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

因此,只有当其中一个表达式为TRUE时才为TRUE,而不是两个表达式都为TRUE。

xor=exclusive or。有关详细信息,请参见维基百科的定义

如果将寄存器与其自身进行异或运算,它将使该寄存器归零

0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
让我们以值41为例(二进制):


在这种情况下,它将清除寄存器。。。XOR是一个“异或”。。。因此,如果ax包含1010,而您是独占的,或者使用1010,您将获得0000(清除)

一个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

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

xor ax,ax是将ax寄存器设置为
0
的最快方法。在指令大小和指令数量方面最快。关于它如何工作的细节,你需要一点位运算的知识

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

两个长度相同的二进制数之间的异或运算在逐位的基础上也同样有效。异或两个数:当两个操作数的对应位不同时,得到一个位设置为1的数字,当对应位相同时,得到0


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

很久以前我开始编程时,处理器或编译器中都没有异或。当我开始讨论它时,我坚持以下描述:

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


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


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

取决于位,但xor(e)ax,(e)ax是两个字节。@Jens:当然,但问题是关于ax的,而不是关于eax的!如果处于16位模式,则指令为两个字节。如果是32位,则为3字节。这非常有用。这个答案在RE中对我很有帮助,所以以防万一:在高级语言中,如果(A!=B),它会转换成类似于
的东西。@TheRookierLearner:
A XOR B
是高级构造的基本构造块。它可以用来实现
(A!=B)
,但它本身就是一个截然不同的操作。此外,nightcracker的声明,即英语中的异或B将被翻译为“A和B不相等”,只有当您从布尔零/非零的角度查看结果时才是正确的。XOR的一个流行应用是切换某个输入位字段的一个或多个位:
XOR 1
的结果是只反转A的低位。作为一种甜味剂,这是现代x86-64微体系结构上寄存器归零的首选方法。它不需要任何执行单元(基本上在解码器中处理),有效地消除了dst=src寄存器上的暂停(等待),并中断了部分标志寄存器的暂停。这一可能的重复似乎不会给以前更详细地提到同一事情的答案增加任何内容。在32位或64位模式下,使用
xor eax,eax
可以更快地将ax归零。较短的编码,并且对上16b的上一个值没有错误依赖。在现代CPU上的16b模式下,可能是xor eax,eax仍然更好,因为
A B | A XOR B
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
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