【问题标题】:What is the meaning of XOR in x86 assembly?x86汇编中的异或是什么意思?
【发布时间】:2011-06-12 14:01:31
【问题描述】:

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

xor     ax, ax

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

【问题讨论】:

  • 作为一种甜味剂,现在这是在现代 x86-64 微架构上将寄存器归零的首选方法。它不需要任何执行单元(基本上在解码器中处理),有效地消除了 dst=src 寄存器上的停顿(等待),并打破了部分标志寄存器停顿。

标签: assembly xor


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 这似乎并没有为之前更详细地提到同一件事的答案添加任何内容。
【解决方案3】:

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

  • 或:如果 a=1 或 b=1 或两者都=1,则为 true
  • 异或:如果 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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 取决于bittage,但xor (e)ax,(e)ax是两个字节。
    • @Jens:当然,但问题是关于 ax,而不是 eax!
    • 如果您处于 16 位模式,则指令为两个字节。如果是 32 位,则为 3 个字节。
    【解决方案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
    

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        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
        

        【讨论】:

        • 这真的很有帮助。这个答案在 RE 中帮助了我,所以以防万一:它会翻译成高级语言中的 if(A != B) 之类的东西。
        • @TheRookierLearner:A XOR B 是高级构造的原始构建块。它可用于来实现(A != B),但它本身就是一个截然不同的操作。此外,nightcracker 的声明,即英语中的 A XOR B 将被翻译为“A 和 B 不相等”,仅当您从布尔零/非零角度查看结果时才是正确的。 XOR 的一个流行应用是切换某个输入位域的一个或多个位:A XOR 1 的结果是仅反转 A 的低位。
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          它决定了逻辑异或

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

          所以,只有当其中一个表达式为真时才为真,而不是两者都为真。

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:
              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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-07-14
                • 1970-01-01
                • 1970-01-01
                • 2011-09-11
                • 1970-01-01
                • 2013-09-15
                • 1970-01-01
                相关资源
                最近更新 更多