call在x86机器代码中指向绝对指针的“正确”方法是什么?有一个好的方法可以在一条指令中完成吗?
我想做什么:
我正在尝试基于“子例程线程”构建一种简化的mini-JIT(仍然)。从根本上讲,这是从字节码解释器开始的最短步骤:每个操作码都是作为单独的函数实现的,因此可以将每个基本字节码块“ JITted”到它自己的新过程中,如下所示:
{prologue}
call {opcode procedure 1}
call {opcode procedure 2}
call {opcode procedure 3}
...etc
{epilogue}
因此,我们的想法是每个块的实际机器代码都可以从模板中粘贴(根据需要扩展中间部分),唯一需要“动态”处理的位是将每个操作码的功能指针复制到正确的地方,作为每个呼叫说明的一部分。
我遇到的问题是了解call ...模板部分要使用什么。x86似乎没有考虑到这种用法,而是支持相对和间接调用。
它看起来像我可以使用FF 15 EFBEADDE或2E FF 15 EFBEADDE在假设调用函数DEADBEEF(通过把东西变成一个汇编和反汇编,看到什么产生有效的结果,基本上发现了这些未通过了解他们在做什么),但我不理解的东东细分和特权以及相关信息,足以看出差异,或者它们与更常见的call指令之间的行为会有何不同。英特尔架构手册还建议这些仅在32位模式下有效,而在64位模式下“无效”。
有人可以解释这些操作码,以及为此目的如何或是否将其使用?
(通过寄存器使用间接调用也有明显的答案,但这似乎是“错误的”方法-假设实际存在直接调用指令。)
LEATH
小唯快跑啊