【发布时间】:2011-06-12 14:01:31
【问题描述】:
我正在进入汇编,我一直在运行 xor,例如:
xor ax, ax
它只是清除寄存器的值吗?
【问题讨论】:
-
作为一种甜味剂,现在这是在现代 x86-64 微架构上将寄存器归零的首选方法。它不需要任何执行单元(基本上在解码器中处理),有效地消除了 dst=src 寄存器上的停顿(等待),并打破了部分标志寄存器停顿。
我正在进入汇编,我一直在运行 xor,例如:
xor ax, ax
它只是清除寄存器的值吗?
【问题讨论】:
xor ax, ax 是将 ax 寄存器设置为0 的最快方法。在指令大小和指令数量方面最快。要详细了解它的工作原理,您需要了解一点位算术知识。
如果一位且只有一位两位为1,则两位之间的异或运算返回1;否则为 0。另一种解释方式是,如果两个位不同,则返回 1;否则为 0。
两个相同长度的二进制数之间的异或运算同样以逐位为基础。对两个数字进行异或运算得到一个数字,其中两个操作数的对应位不同时位设置为 1,对应位相同时位设置为 0。
从这个知识很容易看出,如果两个操作数相同(例如 ax 和 ax),结果将为 0。
【讨论】:
xor eax, eax 将斧头归零更快。更短的编码,并且对前一个 16b 的值没有错误的依赖。在现代 CPU 上的 16b 模式下,xor eax,eax 可能会更好,因为many special benefits of using a recognized zeroing idiom
xor ax,ax 用于将 ax 设置为 0。
原因:通常任何处理器上的 xor 指令在汇编中占用的字节数比使用 movl 0,%ax 时要少
【讨论】:
当我很久以前开始编程时,处理器或编译器中都没有独占或。当我开始使用它时,我坚持描述:
所以:
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
【讨论】:
如果我没记错的话 xor ax, ax 是一个单字节汇编指令,而 mov ax, 0 至少是 3 并且可能需要稍长的时间来执行.解码肯定会比 xor 指令花费更长的时间。
【讨论】:
xor = 异或。请参阅维基百科对Exclusive or 的定义。
如果您将寄存器与自身进行异或,它将将该寄存器归零。
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
我们以值 41 为例(二进制):
101001
xor 101001
= 000000
【讨论】:
xor reg, reg 常用于清除寄存器。可以替代mov reg, 0
AFAIR,在某些情况下它更快(或更短)。
当然,XOR 本身是异或(又名:异或)运算(但在这里描述这些基础知识是一种耻辱 - 使用维基百科)
【讨论】:
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
【讨论】:
if(A != B) 之类的东西。
A XOR B 是高级构造的原始构建块。它可用于来实现(A != B),但它本身就是一个截然不同的操作。此外,nightcracker 的声明,即英语中的 A XOR B 将被翻译为“A 和 B 不相等”,仅当您从布尔零/非零角度查看结果时才是正确的。 XOR 的一个流行应用是切换某个输入位域的一个或多个位:A XOR 1 的结果是仅反转 A 的低位。
在这种情况下,它将清除寄存器... XOR 是“异或”...因此,如果 ax 包含 1010 而您是异或 1010,您将得到 0000(已清除)
【讨论】:
它决定了逻辑异或
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
所以,只有当其中一个表达式为真时才为真,而不是两者都为真。
【讨论】:
xor register, register 通常用于将寄存器“归零”,因为所有位都相互比较:
0 位保持为零。 1 位变为零,因为 1 XOR 1 也是 0。
【讨论】:
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。
【讨论】: