开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1648|回复: 42
收起左侧

[易语言纯源码] 【纯源码】获取带可空参数的子程序地址并显式传递空参数

[复制链接]
发表于 2024-7-15 16:47:42 | 显示全部楼层 |阅读模式   陕西省西安市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 anyuezhiji 于 2024-7-16 15:38 编辑


看到有不少人曾在论坛求助:
1、如何获得带有可空参数的子程序的地址以供调用(系统自带的函数失效了)
2、怎样显式传空参数,避免对多变量是否为空不确定的情况需要写大堆判断

正好对这个问题有兴趣,抽空写了个demo
对参数数量和可空状态不同的情形,请自己改写汇编调用(其实可以可成循环的,偷懒枚举了)

核心思想:
1、把函数编译到固定特征的相对较近位置通过汇编代码获取地址
2、把可空参数拆成两部分通过汇编传标志位

总之,易语言层面没法解决的问题,上汇编总是有办法的

搜狗高速浏览器截图20240716153352.png
汇编调用部分,自己根据参数数量增删代码注释,然后用汇编插件或者用AsmToE转换下就行

程序中一个可空参数,汇编调用时要用到两个参数,非可空参数算一个
然后汇编按照参数个数增加或删除区块
move eax,[ebp+X]
push eax
X从12开始,从箭头可以看到,每个参数+4
然后retn Y,Y就是X最大的值

最后用工具或插件把汇编转机器码就行


补充:用系统自带的调用子程序 ,补齐是否空的标志位后可正常执行子程序,但无法获取返回值
  
调用子程序 (取RunJs地址 (), , 返回地址, 取变量地址 (js), 取变量地址 (参数1), 参数1_是否非空, 取变量地址 (参数2), 参数2_是否非空, 参数3, 参数3_是否非空, 参数4, 参数4_是否非空)


i支持库列表   支持库注释   
spec特殊功能支持库

执行后返回地址不会发生任何变化


补充内容 (2024-7-16 19:46):
已更新,请往下看

补充内容 (2024-7-30 07:48):
更新demo,支持【长整数型】和【双精度小数型】传递,请往下翻贴↓↓↓

显式传递空参数demo.e

6.87 KB, 下载次数: 26, 下载积分: 精币 -2 枚

售价: 1 枚 精币  [记录]

点评

看了demo是42并不对,44也不对,正确应该是40   广东省佛山市  发表于 2024-7-16 16:15
大佬能不能写个多点参数的demo 很需要   浙江省台州市  发表于 2024-7-16 15:25
demo里只写了接收4个参数的情况,如果是5个6个 甚至更多,那个汇编代码不知道咋写 为什么最后一个参数是 +42,而不是+44   浙江省台州市  发表于 2024-7-16 15:24

评分

参与人数 4好评 +1 精币 +7 收起 理由
光影魔术 + 2 开源精神必须支持~
baitso + 1 + 2 支持开源~!感谢分享
多多帅吧 + 1 共同努力,共同进步
1355301564 + 2 YYDS~!

查看全部评分


 楼主| 发表于 2024-7-16 18:39:39 | 显示全部楼层   陕西省西安市
之前的版本优化了下,有些地方需要注意
显式传递空参数demo.e (15.91 KB, 下载次数: 8, 售价: 1 枚 精币)

点评

还是有问题的,并没有修复到   广东省佛山市  发表于 2024-7-17 01:47
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 07:36:29 | 显示全部楼层   陕西省西安市
本帖最后由 anyuezhiji 于 2024-7-30 08:09 编辑

显式传递空参数demo.e (15.97 KB, 下载次数: 4, 售价: 1 枚 精币)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 07:58:38 | 显示全部楼层   陕西省西安市
kirbysxh 发表于 2024-7-19 16:15
如果是 双精度小数型,长整数型等参数,该如何传递,使用取变量地址 不行 ...

https://bbs.125.la/forum.php?mod ... 07&pid=28606362
回复 支持 反对

使用道具 举报

结帖率:75% (9/12)
发表于 2024-7-25 14:43:13 | 显示全部楼层   广东省揭阳市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (42/42)
发表于 2024-7-19 16:15:18 | 显示全部楼层   浙江省湖州市
如果是 双精度小数型,长整数型等参数,该如何传递,使用取变量地址 不行
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)
发表于 2024-7-19 00:38:16 | 显示全部楼层   河南省南阳市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-7-18 13:12:42 | 显示全部楼层   广西壮族自治区柳州市
感谢分享源码
回复 支持 反对

使用道具 举报

结帖率:33% (1/3)
发表于 2024-7-17 10:09:39 | 显示全部楼层   广东省深圳市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-7-17 09:32:06 | 显示全部楼层   广东省深圳市
这个是做什么用途的呢
回复 支持 反对

使用道具 举报

发表于 2024-7-17 08:05:53 | 显示全部楼层   湖北省武汉市
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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