'call dword ptr [mem32]'问题的操作码和ModRM?

为什么不能从EBP寄存器中调用指针地址? 我的意思是在以下代码模式中演示。

  • 操作码:'0xFF 0x10' - > CALL DWORD PTR DS:[EAX]
  • 操作码:'0xFF 0x11' - > CALL DWORD PTR DS:[ECX]
  • OpCode:'0xFF 0x12' - > CALL DWORD PTR DS:[EDX]
  • 操作码:'0xFF 0x13' - > CALL DWORD PTR DS:[EBX]
  • 操作码:'0xFF 0x14' - > CALL DWORD PTR SS:[ESP + EDI]
  • 操作码:'0xFF 0x15 0x012345678' - > CALL DWORD PTR DS:[0x012345678]
  • OpCode:'0xFF 0x16' - > CALL DWORD PTR DS:[ESI]
  • 操作码:'0xFF 0x16' - > CALL DWORD PTR DS:[EDI]
  • “英特尔指导手册”中记录了“5”,但“6”从未直接引用,并且从未明确声明不能从EBP寄存器中调用它。 我知道这不是无用的功能,但我想知道为什么英特尔选择这两个寄存器来利用,这只是一个设计选择,或者是他们缺少的东西? (我有一个猜测,但我很好奇真正的原因是什么。)


    你可以通过EBP调用,它的编码方式不同。 你需要序列

    0xff 0x55 0x00
    

    问题在于没有偏移量编码EBP(上面指定的EBP的字节偏移量为0)是无法编码的,因为通常希望为不带偏移量(0x15)的EBP编码意味着32位绝对值。

    还要注意您的0xff 0x14示例 - 在这种情况下,会有第三个字节(SIB字节)编码基址寄存器,索引寄存器和比例因子。 像你的例子一样,ESP + EDI的第三个字节是0x3c - 你希望第三个字节是0x24来得到ESP

    至于为什么他们选择EBP和ESP作为无法简单编码的寄存器,其原因是ESP是堆栈指针(所以通常通过push / pop指令访问),而EBP是帧指针,所以你很少想要解引用它直接没有偏移量。 80386的设计至少是这种情况。

    链接地址: http://www.djcxy.com/p/43849.html

    上一篇: Opcode and ModRM for 'call dword ptr [mem32]' question?

    下一篇: Profiling the C++ compilation process