大佬教程收集整理的这篇文章主要介绍了我正在编写自己的JIT解释器.如何执行生成的指令?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
实际上我不知道JIT是如何工作的,但这是我对它的看法:用一些中间语言读入程序.将其编译为x86指令.确保最后一条指令返回到VM代码中的某个地方.将指令存储在内存中的某些位置.无条件跳转到第一条指令.瞧!
#include <stdlib.h> #include <stdio.h> #include <unistd.h> int main() { int *m = malloc(sizeof(int)); *m = 0x90; // NOP instruction code asm("jmp *%0" : /* outputs: */ /* none */ : /* inputs: */ "d" (m) : /* clobbers: */ "eax"); return 42;
}
好的,所以我的目的是让这个程序将NOP指令存储在内存中的某个位置,跳转到该位置然后可能崩溃(因为我没有设置任何方式让程序返回到main).
问题:我是走在正确的道路上吗?
问题:你能告诉我一个经过@L_607_6@的程序,它可以找到回到main中某个地方的方法吗?
问题:我应该注意的其他问题?
PS:我的目标是获得理解,而不是以正确的方式做所有事情.
感谢所有的反馈.以下代码似乎是在我的Linux机器上启动和工作的地方:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/mman.h> unsigned char *m; int main() { unsigned int pagesize = getpagesize(); printf("pagesize: %u\n",pagesizE); m = malloc(1023+pagesize+1); if(m==NULL) return(1); printf("%p\n",m); m = (unsigned char *)(((long)m + pagesize-1) & ~(pagesize-1)); printf("%p\n",m); if(mprotect(m,1024,PROT_READ|PROT_EXEC|PROT_WRITE)) { printf("mprotect fail...\n"); return 0; } m[0] = 0xc9; //leave m[1] = 0xc3; //ret m[2] = 0x90; //nop printf("%p\n",m); asm("jmp *%0" : /* outputs: */ /* none */ : /* inputs: */ "d" (m) : /* clobbers: */ "ebx"); return 21; }
以上是大佬教程为你收集整理的我正在编写自己的JIT解释器.如何执行生成的指令?全部内容,希望文章能够帮你解决我正在编写自己的JIT解释器.如何执行生成的指令?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。