C(或asm):如何执行存储在内存中的c代码(从标签复制)

时间:2012-07-12 08:36:19

标签: c memory assembly

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

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

但我不能在没有记忆错误的情况下阅读它

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

2 个答案:

答案 0 :(得分:2)

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

此外,您无法获取标签的地址。标签不是对象或功能。

正确地指出,数据区域通常放在内存中,其内容不能作为CPU指令执行。但是,通常有解决方法。 Windows和Linux提供的功能可以更改内存区域的权限/权限/权限/无论你调用它。

例如,这是an example做你想在Windows上做的事情。

答案 1 :(得分:1)

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

How to make a C program that can run x86 hex codes

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

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

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