gpt4 book ai didi

c++ - 如何动态生成和运行 native 代码?

转载 作者:IT老高 更新时间:2023-10-28 12:40:16 26 4
gpt4 key购买 nike

我想为我编写的玩具语言处理器编写一个非常小的概念验证 JIT 编译器(纯粹是学术性的),但我在设计的中等高度遇到了一些麻烦。从概念上讲,我熟悉 JIT 的工作原理——您将字节码编译成(机器或程序集?)代码以运行。然而,在具体细节层面,我不太了解如何你实际上是如何的。

我的(非常“新手”)下意识的 react ,因为我没有第一个线索从哪里开始,会尝试如下:

  1. mmap() 一 block 内存,设置对 PROT_EXEC 的访问
  2. 将 native 代码写入 block 中
  3. 在舒适的地方存储当前寄存器(堆栈指针等)
  4. 修改当前寄存器以指向映射区域中的 native 代码块
  5. native 代码现在将由机器执行
  6. 恢复之前的寄存器

这是否甚至 接近 一个/正确的算法?我尝试仔细阅读我知道有 JIT 编译器来研究的不同项目(例如 V8),但这些代码库由于它们的大小而难以使用,我不知道从哪里开始寻找。

最佳答案

不确定 linux,但这适用于 x86/windows。
更新:http://codepad.org/sQoF6kR8

#include <stdio.h>
#include <windows.h>

typedef unsigned char byte;

int arg1;
int arg2;
int res1;

typedef void (*pfunc)(void);

union funcptr {
pfunc x;
byte* y;
};

int main( void ) {

byte* buf = (byte*)VirtualAllocEx( GetCurrentProcess(), 0, 1<<16, MEM_COMMIT, PAGE_EXECUTE_READWRITE );

if( buf==0 ) return 0;

byte* p = buf;

*p++ = 0x50; // push eax
*p++ = 0x52; // push edx

*p++ = 0xA1; // mov eax, [arg2]
(int*&)p[0] = &arg2; p+=sizeof(int*);

*p++ = 0x92; // xchg edx,eax

*p++ = 0xA1; // mov eax, [arg1]
(int*&)p[0] = &arg1; p+=sizeof(int*);

*p++ = 0xF7; *p++ = 0xEA; // imul edx

*p++ = 0xA3; // mov [res1],eax
(int*&)p[0] = &res1; p+=sizeof(int*);

*p++ = 0x5A; // pop edx
*p++ = 0x58; // pop eax
*p++ = 0xC3; // ret

funcptr func;
func.y = buf;

arg1 = 123; arg2 = 321; res1 = 0;

func.x(); // call generated code

printf( "arg1=%i arg2=%i arg1*arg2=%i func(arg1,arg2)=%i\n", arg1,arg2,arg1*arg2,res1 );

}

关于c++ - 如何动态生成和运行 native 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4911993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com