需要帮助理解E8 asm调用指令x86

Mic*_*ael 16 x86 assembly disassembly

我需要一个帮助,以了解以下汇编指令.在我看来,我在someUnknownValue + = 20994A调用地址?

E8 32F6FFFF - call std::_Init_locks::operator=+20994A
Run Code Online (Sandbox Code Playgroud)

Mat*_*ery 52

无论你使用什么来获得反汇编,都试图通过将调用的目标作为它所知道的某个符号的偏移量来提供帮助 - 但是考虑到偏移是如此之大,它可能会混淆.

呼叫的实际目标可以按如下方式计算:

  • E8是一个call相对偏移量.
  • 在32位代码段中,偏移量被指定为带符号的32位值.
  • 该值采用little-endian字节顺序.
  • 偏移量是从以下指令的地址开始测量的.

例如

<some address>       E8 32 F6 FF FF         call <somewhere>
<some address>+5     (next instruction)
Run Code Online (Sandbox Code Playgroud)
  • 偏移是0xFFFFF632.
  • 解释为带符号的32位值,这是-0x9CE.
  • call指令是在<some address>和为5个字节长; 下一条指令是在<some address> + 5.
  • 所以呼叫的目标地址是<some address> + 5 - 0x9CE.