我试图通过在标签之间将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
但我不能偷听读出它而不得到一个内存错误
我很高兴有任何链接或任何建议如何实现这个
goto
只跳转到标签,而不是数组或其他任何内容。
此外,您不能获取标签的地址。标签不是对象或函数。
有人正确地指出,数据区通常放在存储器中,其内容不能作为CPU指令执行。然而,通常有解决办法。Windows和Linux提供了更改内存区域的权限/权限/特权的功能。
例如,这里有一个在Windows上做你想做的事情的例子。
除了Alexey的回答之外,我还将链接我自己创建jit执行器的示例。
如何制作一个可以运行x86十六进制代码的C程序
AsmJIT库是一个很好的x86/x64"单行"汇编程序,它实际上创建了一个完整的可执行内存块。
jit引擎的可移植版本是LuaJIT。它支持为ARM/x86/PPowerPC/MIPS体系结构创建功能蹦床。
"指向标签的指针"在C中不可能是标准的,因为有些硬件架构中的数据和代码不共享同一内存。