02 2009 档案
JIT脚本引擎:用汇编写了一个四则运算字符串分析程序
摘要: 这个汇编程序读入一个字符串,并计算结果。支持加减乘除括号,不支持浮点数,不支持查错。以下是汇编以及注释。汇编程序使用这篇文章的程序编译并执行。
阅读全文
posted @
2009-02-26 09:05 陈梓瀚(vczh) 阅读(2262) |
评论 (0) 编辑
JIT脚本引擎:动态运行文本格式的汇编代码
摘要: 今天完成了文本格式汇编代码的编译工作。这主要是为了调试,因为编译器不可能产生文本格式的汇编代码,这样会很浪费资源。翻译过程如下:
阅读全文
posted @
2009-02-26 01:27 陈梓瀚(vczh) 阅读(3425) |
评论 (2) 编辑
JIT脚本引擎:完成链接器的核心功能
摘要: 光能编译汇编还是不行的,因为很多东西在编译的时候不知道,典型的比如放常量那部分的指针等等。主要原因还是因为x87(指FPU部分)没有指令包含浮点立即数,所有装载浮点常数的指令都要求提供指针。所以诸如double a=1.2;之类的代码,需要将1.2预先放置在一个地方然后确定指针的位置。
于是就遇到了一个问题,如何将编译后才知道的指针地址写进去呢?
阅读全文
posted @
2009-02-22 22:41 陈梓瀚(vczh) 阅读(1984) |
评论 (1) 编辑
JIT脚本引擎:将汇编语言编译成机器码写进内存并在C++中调用
摘要: 在完成了这里和这里的工作之后,就可以写程序生成机器码了。在生成机器码的时候有如下注意事项:
1:可执行代码所在的空间必须使用VirtualAlloc与PAGE_EXECUTE_READWRITE标记分配。
2:程序需要的常量空间、全局变量空间和指令空间需要分开在三个不同的地方。
下面的例子使用一个struct保存指令的每一个部分,并且结合之前产生的指令译码表生成二进制码。
阅读全文
posted @
2009-02-22 07:08 陈梓瀚(vczh) 阅读(5011) |
评论 (11) 编辑
JIT脚本引擎:识别需要使用66H前缀区分的相同opcode指令的16位版本和32位版本
摘要: 关于这个问题实在没有一个特别好的方法,基本方法还是来源于对intel手册的观察。因为指令表是从手册上面复制出来的,但是上面又没有标明66H前缀,怎么办呢?人肉找规律。这里贴出了区分的代码(进对于之前挑选出来的绝大多数x86与x87指令)以及生成后的一个很有规则的文件以供参考。
阅读全文
posted @
2009-02-16 21:53 陈梓瀚(vczh) 阅读(2401) |
评论 (1) 编辑
JIT脚本引擎:将汇编指令转换为机器码
摘要: 完整的转换方法需要intel提供免费翻印下载的那本手册。手册过于精简,因此这里给出的例子用于辅助对手册进行理解。假设读者阅读过intel提供的手册,或其他相关资料。
阅读全文
posted @
2009-02-15 23:45 陈梓瀚(vczh) 阅读(3739) |
评论 (5) 编辑
JIT脚本引擎:x86子集汇编二进制码表整理完成
摘要: 为了节省工作量,我打开intel的手册,然后将那些框框里面的字符串复制到一个文本文件里面,最后写一个C++程序用正则表达式处理。流程如下(含代码和文件):
阅读全文
posted @
2009-02-14 20:21 陈梓瀚(vczh) 阅读(3185) |
评论 (2) 编辑