手把手教你写脚本引擎 PPT与Demo(一)
摘要:
华南理工大学微软俱乐部程序设计语言特别兴趣小组——手把手教你写脚本引擎系列(一)
陈梓瀚
PPT内容:
1、简单指令集的设计方法(支持分支、循环、函数、递归)。
2、编译控制流程(分支和循环)的一般模式。
3、函数调用的详细过程。
4、5个示例程序。
Demo内容:
PPT中5个示例程序的运行过程(动画),左边是单步,右边是堆栈内容。
含下载,内详。
阅读全文
posted @
2009-03-28 01:43 陈梓瀚(vczh) 阅读(10717) |
评论 (11) 编辑
JIT脚本引擎:中间语言定稿并完成验证工作
摘要: 经过一个多星期的推敲,终于将中间语言定稿。为了屏蔽寄存器、堆栈、数值比较逻辑、跳转、变量参数存放位置等,设计了以下中间语言。
阅读全文
posted @
2009-03-19 20:49 陈梓瀚(vczh) 阅读(2255) |
评论 (1) 编辑
JIT脚本引擎:中间指令草稿
摘要: 中间指令主要用于解决以下问题:
1、不同大小的整数、浮点、指针的互相转换和计算
2、寄存器分配
3、跳转
4、调用转换(stdcall、cdecl、fastcall)
5、临时存储单位(变量等)
因此指令在设计的时候需要
1、不让用户知道东西是放在哪里的(没有堆栈给你push和pop,而且变量在物理上不一定存在,譬如说可能在寄存器里面,或者直接优化没了等等)
2、不让用户接触到各种标志位(譬如说那个恶心的浮点比较)
3、不让用户接触到stdcall、cdecl和fastcall的区别(因此call指令需要将所有参数一起写入,而不是在之前push)
4、不让用户接触不同类型数据的转换过程(全自动处理,就算你int32=fp32+int16,也是一条指令。)
5、为了保持灵活性,声明变量的时候只指出其大小,在使用变量的每一处地方标记类型(因此可以在不同的地方标记为不同的,可以救急)
阅读全文
posted @
2009-03-10 21:05 陈梓瀚(vczh) 阅读(1858) |
评论 (0) 编辑
JIT脚本引擎:成员对齐详解
摘要: 为了让编译成x86后的代码可以转换成C++的函数指针,我们也必须处理成员对齐的事情。如果脚本里的结构成员对齐跟C++不一致的话,会造成很多麻烦。下面是成员对齐的计算方法:
阅读全文
posted @
2009-03-09 20:46 陈梓瀚(vczh) 阅读(3803) |
评论 (2) 编辑
JIT脚本引擎:浮点运算
摘要: x87的FPU支持很多种浮点运算,其中浮点运算的比较结果不放在EFLAGS里,我们需要人手取出。在比较a和b的时候,C2=0,C3=(a==b),C0=(a<b)。我们可以将FNSTSW AX指令将浮点标志位复制到AX,然后通过读取C3、C2和C0(分别位于第14、10、8位)来判断结果。下面是一个求浮点数组最大值的汇编函数:
阅读全文
posted @
2009-03-06 04:56 陈梓瀚(vczh) 阅读(1538) |
评论 (0) 编辑
JIT脚本引擎:关于自己的异常处理函数在Release下失效的解决办法
摘要: 本来昨天搞定了异常处理之后决定狂喜一天,谁知道今天用release编译了一下之后竟然挂了!资料找了半天发现是Windows XP之后提供的一项保护SAFESEH搞的鬼。于是需要将自己的异常处理函数添加进PE头的SAFESEH列表中。方法如下:
阅读全文
posted @
2009-03-04 08:40 陈梓瀚(vczh) 阅读(1951) |
评论 (2) 编辑
JIT脚本引擎:使用汇编实现__try和__catch
摘要: 使用上一篇文章的资料,就可以使用汇编实现异常处理了。下面来看一个例子。
阅读全文
posted @
2009-03-03 00:20 陈梓瀚(vczh) 阅读(2324) |
评论 (1) 编辑
JIT脚本引擎:stdcall、cdecl和fastcall
摘要: stdcall、cdecl和fastcall的参数都是从右到左入栈,并且返回值遵循以下规律:
小于等于4字节结构用EAX
小于等于8字节结构用EDX:EAX
浮点数用ST(0)
其他则在EAX放置一个指针,供返回值使用
stdcall被调用者清栈,cdecl调用者清栈,fastcall被调用者清栈并且前两个小于等于4字节的参数放入ECX和EDX。返回值和参数如果一方有构造函数或析构函数则不使用寄存器。
于是今天用字符串形式的汇编写了三种调用方法的求和函数:
阅读全文
posted @
2009-03-01 05:27 陈梓瀚(vczh) 阅读(1855) |
评论 (9) 编辑