了解汇编中的 JMP 代码

Bre*_*eli 0 x86 assembly opcode disassembly instruction-encoding

我最近刚刚触及汇编语言和调试的表面。我有以下代码:

Address   Hex dump          Command                                  Comments
006E3689   .  E8 C5F9FFFF   CALL 006E3053
->006E368E      E9            DB E9
->006E368F      35            DB 35                                    ; CHAR '5'
->006E3690      80            DB 80
->006E3691   .  0000D490      DD 90D40000
006E3695  />  E8 72040000   CALL 006E3B0C
Run Code Online (Sandbox Code Playgroud)

再往下...

Address   Hex dump          Command                                  Comments
006EB6C8  /.  6A 58         PUSH 58
006EB6CA  |.  68 A0372A00   PUSH 2A37A0
006EB6CF    ^ E9 C17FFFFF   JMP 006E3695
Run Code Online (Sandbox Code Playgroud)

现在,在我编译 -> 指示的代码之前,实际上都包含在 a 中,JMP 006EB6C8当然只是跳到第二组代码,推送了一些内容并返回到顶部。

现在这段代码仍然有效,但我不确定为什么代码在编译时发生了变化(使用 Ollydbg),但更重要的是(我相信)代码如何知道跳转以及跳多远。到目前为止,我的研究告诉我E9是跳转的操作码,但我还没有找到有关 和35的信息80

我假设这0000D490是某种偏移量,但我找不到任何将地址相加的数学006EB6C8

Jes*_*ter 6

我很困惑为什么 OllyDbg 不为你拆解那个跳转。反正,E9正如你已经弄清楚的那样,附近有一个 jmp 。它距离下一条指令的起始位置有 4 个字节的偏移量。因此,您的指令实际上E9 35 80 00 00意味着jump to address of next instruction + 00008035(x86 使用小端字节顺序)。下一条指令的地址当然是006E3693,因此跳转会将您带到006E3693 + 00008035 = 006EB6C8您最初编写的内容。