游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2343|回复: 5

脚本机问题:函数调用

[复制链接]

3

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2008-4-24 15:17:00 | 显示全部楼层 |阅读模式
脚本机问题
关于接口函数调用
目的是在虚拟机中使用引入的接口函数
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,对于不同函数类型(不是返回值),
因为上面的方法是相当于直接使用进程内部函数,所以这里指的是动态链接库中的接口函数,不同线程,不同进程等等情况,以上方法能否适用。
各位大大,请不吝赐教。








362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-24 17:16:00 | 显示全部楼层

Re:脚本机问题:函数调用

严格用虚拟机编写。

你的理解还比较模糊。

3

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2008-4-24 18:25:00 | 显示全部楼层

Re: 脚本机问题:函数调用

谢了。
就是对它的理解的确比较模糊。
有没有什么好的文章推荐推荐?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-25 02:04:00 | 显示全部楼层

Re:脚本机问题:函数调用

脚本调用主程序里的函数,可以使用:

1 switch...case
2 函数指针
3 虚函数(本质上==2)

不知道你为何用__asm

如果脚本中的对象指针为o,函数为f,
在主程序里可以编写为:

class __obj;
( (_obj *)o ->* (void (__obj::*)(void)) f ) ();

3

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2008-4-25 18:34:00 | 显示全部楼层

Re: Re:脚本机问题:函数调用

instemast: Re:脚本机问题:函数调用

脚本调用主程序里的函数,可以使用:

1 switch...case
2 函数指针
3 虚函数(本质上==2)

不知道你...

向熬夜的筒子致敬。
其实我的意思就是

脚本调用主程序里的函数的方法
2 函数指针

至于用
__asm call A(地址值,本质就是那个函数指针,只不过没有类型参数检查,需要自己写) 的内联汇编是因为最近研究汇编,用顺手了。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-26 17:25:00 | 显示全部楼层

Re:脚本机问题:函数调用

汇编不安全。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 16:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表