【问题标题】:How to interpret the opcode manually?如何手动解释操作码?
【发布时间】:2011-08-26 13:33:27
【问题描述】:
77f4bcbc 8945fc          mov     dword ptr [ebp-4],eax

这是规则:

88  /r   MOV r/m8,r8       2/2           Move byte register to r/m byte
89  /r   MOV r/m16,r16     2/2           Move word register to r/m word
89  /r   MOV r/m32,r32     2/2           Move dword register to r/m dword

8945fc如何解释为mov dword ptr [ebp-4],eax

【问题讨论】:

  • 您到底想做什么?哪个机器操作码?英特尔 x86 ?
  • @phoxis,是的,它是 x86,我无法将操作码解释为程序集..

标签: assembly opcode


【解决方案1】:

89 是操作码
45 编码源和目标
fc 是偏移量 (-4)

【讨论】:

    【解决方案2】:

    如果您想编写自己的反汇编程序,here 是您所需要的。

    如需快速总结,请查看here

    【讨论】:

      【解决方案3】:

      我们这里有一个三字节指令:89 45 fc。第一个字节是操作码字节。在表格中查找它,我们可以看到它是一条 MOV 指令,它需要一个 Mod R/M 字节。 Mod R/M 字节的布局如下:

       7  6   5  4  3   2  1  0
      +-----+---------+---------+
      | Mod |   Reg   |   R/M   | 
      +-----+---------+---------+
      

      让我们看一下指令的第二个字节。 0x45 是二进制的 01.000.101。因此,Mod 为 01,Reg 为 000,R/M 为 101。

      在参考中查找,例如here,我们可以看到Mod=01和R/M=101的组合对应的是[EBP+sbyte]操作数。 “sbyte”是一个 8 位有符号位移,编码在第三个字节:0xFC。由于位移是有符号的,它必须被解释为这样的数字,即-4。

      指令旁边的“/r”注释告诉我们寄存器(第二个)操作数由指令的Reg字段指定。 Reg=000 是 al/ax/eax。假设默认为 32 位模式,这将意味着 eax。

      综合以上,我们得到

      MOV [EBP-4], EAX
      

      【讨论】:

      • 只是想知道,你是如何发现 MOV 需要一个 Mod R/M 字节的?我应该用这个来解决这个问题:r/m16/32 还是 r16/32?
      【解决方案4】:

      寻找 mov dword ptr [ebp-4],eax 你有 8 位代码。你可以很容易地得到它 这是程序 前六位已给出或应为 mov 命令记住,然后在 LSB 上添加目标位 (D),其中 d=1 当目标中有寄存器时,或 d=0 时寄存器在源中。这里是寄存器 eax在源端,所以应该加 0,然后最后一位称为字位(W 位)被添加到目标位之后的 LSB 端,其中 W bit= 1 当有 16/32 位寄存器或 0 当有 8 位寄存器所以现在根据命令 "mov dword ptr [ebp-4],eax"
      d 位=0 和 w 位=1 现在你得到了 8 位操作码 那么你必须找出 MOD(R/M) 字段。 为此,您必须找出三件事。 1) 模值 2) 寄存器值 3) R/M 值 这是格式 +-----+---------+---------+ |国防部 |注册 |读/写 | +-----+---------+---------+ 如上面的答案所述 然后签入命令 mov dword ptr [ebp-4],eax 根据-4有8位位移然后mod值=01 MOD 值: 00 表示无位移 01 表示 8 位位移 10 表示 16 位位移 11 用于注册到注册转移

      所以在这里 模组=01 然后 对于 reg eax,值为 000 对于 (R/M),值为 101

      所以 R/M 字段 8 位是

      01000101 希望这个描述会有所帮助

      【讨论】:

        猜你喜欢
        • 2015-04-24
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        相关资源
        最近更新 更多