7

我尝试通过将标签之间的 C 代码中的代码段复制到 malloc 分配的内存来“内联”我的 VM。所以我用开始和结束标签定义了操作,我想将以下代码定义的指令复制到缓冲区然后执行(我不确定这是否可能)

OP_PUSH0_START:
    sp += 4; *sp = 0; // I WANT THE INSTRUCTIONS OF THIS LINE COPIED TO THE BUFFER
OP_PUSH0_END:

这样做我认为下面的代码片段会起作用

void * ptr0 = &&OP_PUSH0_START;
void * ptr1 = &&OP_PUSH0_END;
while(ptr0 < ptr1)
{
    buf[c++] = *ptr0;
    ptr0++;
}
goto buf; //jump to start of buffer

但我什至不能在没有内存错误的情况下读出来

我会很高兴任何链接或任何建议如何实现这一点

4

2 回答 2

3

将执行转移到任意位置的唯一合法方法是使用函数指针。goto只跳转到标签,而不是数组或其他任何东西。

您也不能获取标签的地址。标签不是对象或函数。

正确地指出,数据区域通常放置在内存中,其内容不能作为 CPU 指令执行。但是,通常有解决方法。Windows 和 Linux 提供了更改内存区域的权限/权利/特权/无论您怎么称呼它的功能。

例如,这是一个在 Windows 上尝试做的事情的例子。

于 2012-07-12T08:51:13.993 回答
1

只是对 Alexey 的回答的补充,我将链接我自己的创建 jit-executor 的示例。

如何制作可以运行 x86 十六进制代码的 C 程序

AsmJIT是一个很好的 x86/x64“单行”汇编器,它实际上创建了一个完整的可执行内存块。

jit 引擎的便携版本是LuaJIT。它支持为 ARM/x86/PowerPC/MIPS 架构创建函数蹦床。

关于“指向标签的指针”的事情在 C 中不是标准的,因为在某些硬件架构中数据和代码不共享相同的内存。

于 2012-07-12T19:43:59.977 回答