Assembly 或者,XOR计算(XOR->;XOR->;或->;JNZ)

Assembly 或者,XOR计算(XOR->;XOR->;或->;JNZ),assembly,xor,Assembly,Xor,我正在尝试解决下面的代码(就像跳转不被接受一样),但我觉得这是一个陷阱 XOR EDX,EDI (00268725,00000000) XOR EAX,ECX (AF51B153, user input) OR EDX, EAX (00268725,EAX) JNZ some address 这里的诀窍是什么。我试图将最后一个OR值设置为0,但如果我在最后一条指令中输入了将抵消为0的值,那么在上一条指令中显然会出错 EDI似乎总是00000000。(但我怀疑是否应该) EAX似乎总是

我正在尝试解决下面的代码(就像跳转不被接受一样),但我觉得这是一个陷阱

XOR EDX,EDI  (00268725,00000000)
XOR EAX,ECX  (AF51B153, user input)
OR  EDX, EAX (00268725,EAX) 
JNZ some address
这里的诀窍是什么。我试图将最后一个OR值设置为0,但如果我在最后一条指令中输入了将抵消为0的值,那么在上一条指令中显然会出错

  • EDI似乎总是00000000。(但我怀疑是否应该)
  • EAX似乎总是AF51B153
  • EDX似乎总是为00268725

    • 没有办法做到这一点。在您展示的代码中,将始终采用条件分支。为什么会这样?那么,让我们分析一下代码:

      如果我读对了,右边的括号表示法指定了执行这行代码时
      EDX
      EDI
      寄存器中的值。如果它们确实都是常量,那么这条指令似乎毫无意义,为什么在运行时用两个常量值进行异或运算,而您可以在编译时执行此操作并将
      EDX
      设置为结果

      无论如何,
      00268725 XOR 0
      =
      00268725
      ,因为任何数字XOR 0都是相同的数字。
      XOR的真值表如下所示:

      |   Input   | Output |
      |  A  |  B  |        |
      |-----|-----|--------|
      |  0  |  0  |   0    |
      |  0  |  1  |   1    |
      |  1  |  0  |   1    |
      |  1  |  1  |   0    |
      
      因此,执行此指令后,
      EDX
      包含
      00268725
      ,这与您的观察结果一致

      (当你说你怀疑
      EDI
      是否应该包含0时,我不知道你是什么意思。要么寄存器包含定义的值,要么它接收到不可预测的输入值。在前一种情况下,你可以分析代码。在后一种情况下,你不能。)

      这里,
      AF51B153
      (在
      EAX
      中)将与用户输入(在
      ECX
      中)进行异或。由于用户输入不是一个常量值,我们无法预测结果会是什么,但一旦我们查看下一条指令,这并不重要

      现在,第一条指令(在
      EDX
      中)的结果与第二条指令(在
      EAX
      中)的结果进行OR运算。以下是OR函数的真值表:

      |   Input   | Output |
      |  A  |  B  |        |
      |-----|-----|--------|
      |  0  |  0  |   0    |
      |  0  |  1  |   1    |
      |  1  |  0  |   1    |
      |  1  |  1  |   1    |
      
      因为我们知道
      EDX
      的值是
      00268725
      ,所以
      EAX
      的值是多少并不重要。没有可用于或
      00268725
      获取0的值。从OR函数中获取0的唯一方法是使两个输入都为0,并且您知道
      EDX
      始终为非零


      因此,此指令(在EDX中)的结果始终为非零,因此将永远不会设置零标志(
      ZF
      )。这意味着
      JNZ
      将永远占据分支。

      也许是我,但我不明白这个语法,你想实现什么?要使
      eax
      等于0,将其与自身进行异或
      xor eax,eax
      这是以jnz结尾的3条指令。所以xor 1,xor 2,最后是or,后面是jnz。我需要最后一个OR的结果为0。所以要从OR中得到0,两个输入都必须为0。因此
      edi=0
      eax=0
      。要使
      eax
      为零,它必须等于
      ecx
      。如果只有“用户输入”可修改,则无法解决此问题。
      XOR EDX、EDI
      将保持
      EDX
      设置为
      00268725
      00268725
      。感谢您用图表详细解释。这有助于我进一步了解为什么EDI总是0。这就是问题所在!。
      
      XOR EAX,ECX  (AF51B153, user input)
      
      OR  EDX, EAX (00268725,EAX) 
      
      |   Input   | Output |
      |  A  |  B  |        |
      |-----|-----|--------|
      |  0  |  0  |   0    |
      |  0  |  1  |   1    |
      |  1  |  0  |   1    |
      |  1  |  1  |   1    |