'call dword ptr [mem32]'问题的操作码和ModRM?
为什么不能从EBP寄存器中调用指针地址? 我的意思是在以下代码模式中演示。
“英特尔指导手册”中记录了“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?