我正在组装,我一直在运行 xor,例如:
xor ax, ax
它只是清除寄存器的值吗?
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
xor reg, reg
常用于清除寄存器。它可以替代mov reg, 0
AFAIR,在某些情况下它更快(或更短)。
当然,XOR 本身是异或(又名:异或)操作(但在这里描述这样的基础知识是一种耻辱 - 使用维基百科)
xor ax, ax
是将 ax 寄存器设置为 的最快方法0
。在指令大小和指令数量方面最快。有关它如何工作的详细信息,您需要了解一点位算术知识。
如果两位中只有一位为 1,则两位之间的异或运算返回1;否则为 0。另一种解释方式是,如果两个位不同,则返回 1;否则为 0。
相同长度的两个二进制数之间的异或运算同样以逐位为基础进行。对两个数字进行异或运算,您会得到一个位设置为 1 的数字,其中两个操作数的对应位不同,对应位相同时为 0。
从这些知识中很容易看出,如果两个操作数相同(例如 ax 和 ax),结果将为 0。
xor register, register
通常用于将寄存器“归零”,因为所有位都相互比较:
0 位保持为零。1 位变为零,因为 1 XOR 1 也是 0。
xor = 异或。请参阅维基百科对Exclusive or的定义。
如果您将寄存器与自身异或,它将将该寄存器归零。
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
让我们以值 41 为例(二进制):
101001
xor 101001
= 000000
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 是“异或”...因此,如果 ax 包含 1010 而您是异或 1010,您将得到 0000(已清除)
如果我没记错的话xor ax, ax是一个单字节的汇编指令,而mov ax, 0至少是 3 并且可能需要稍长的时间来执行。解码肯定会比 xor 指令花费更长的时间。
当我很久以前开始编程时,处理器或编译器都没有独占或。当我解决它时,我坚持描述:
所以:
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
它确定逻辑异或
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
因此,仅当表达式之一为真时才为 TRUE,而不是两者都为真。
xor ax,ax 用于将 ax 设置为 0。
原因:通常,任何处理器上的 xor 指令在汇编中占用的字节数少于使用movl 0,%ax