|
|
脚本机问题
关于接口函数调用
目的是在虚拟机中使用引入的接口函数
eg.3d模块中需要有一个函数A()能够被脚本机支持,也就是当脚本机执行时遇到“A()”的字符串时可以调用3d模块中A();
我的实现/伪代码:
3d模块编译期间,得到A()的属性
包括:
A的调用
A的返回值
A的返回类型
A的类型
A的定义参数情况
etc.
存入脚本机
(脚本机和3d模块一起编译)
以上参数用于脚本执行时对A()的调用
,研究了一下内联汇编,实现A的调用读取(后面几个简单)
在汇编中,标识符A直接就是指向函数跳转的地址
如A 的值为 0x00040001,那么地址0x00040001 的内容就是 jmp address
这里 address 就是函数A()实际地址 调用A()我们只需要A的地址 0x00040001
那么
步骤:得到A
可用以下两种办法//或许更多,因为A的本质还是4字节的指针(数据)
1,__asm mov ebx,A
2,(int)A//强制类型转换 也会得到 0x00040001
步骤:调用A
可以使用
__asm call A //实际上也就执行了A()
步骤:如果有参数para,可以从右至左
push para
步骤:调用完后记得复原堆栈ebp
add ebp para_num*4
步骤:返回值 re
mov eax,re //eax的值就是返回值地址
以上实现方法看起来很猥琐,只因为我不想写switch case 堆(没错,函数多了就是一大堆)
我的想法是通过查表(把函数调用弄成一个数组也可以map<char,int>)
把程序简化
我的问题,
1,以上方法 有无重大缺陷
2,对于不同函数类型(不是返回值),
因为上面的方法是相当于直接使用进程内部函数,所以这里指的是动态链接库中的接口函数,不同线程,不同进程等等情况,以上方法能否适用。
各位大大,请不吝赐教。
|
|