本帖最后由 anyuezhiji 于 2024-7-16 15:38 编辑
看到有不少人曾在论坛求助:
1、如何获得带有可空参数的子程序的地址以供调用(系统自带的函数失效了)
2、怎样显式传空参数,避免对多变量是否为空不确定的情况需要写大堆判断
正好对这个问题有兴趣,抽空写了个demo
对参数数量和可空状态不同的情形,请自己改写汇编调用(其实可以可成循环的,偷懒枚举了)
核心思想:
1、把函数编译到固定特征的相对较近位置通过汇编代码获取地址
2、把可空参数拆成两部分通过汇编传标志位
总之,易语言层面没法解决的问题,上汇编总是有办法的
汇编调用部分,自己根据参数数量增删代码注释,然后用汇编插件或者用AsmToE转换下就行
程序中一个可空参数,汇编调用时要用到两个参数,非可空参数算一个
然后汇编按照参数个数增加或删除区块
move eax,[ebp+X]
push eax
X从12开始,从箭头可以看到,每个参数+4
然后retn Y,Y就是X最大的值
最后用工具或插件把汇编转机器码就行
补充:用系统自带的调用子程序 ,补齐是否空的标志位后可正常执行子程序,但无法获取返回值
调用子程序 (取RunJs地址 (), , 返回地址, 取变量地址 (js ), 取变量地址 (参数1 ), 参数1_是否非空, 取变量地址 (参数2 ), 参数2_是否非空, 参数3, 参数3_是否非空, 参数4, 参数4_是否非空 )
执行后返回地址不会发生任何变化
补充内容 (2024-7-16 19:46):
已更新,请往下看
补充内容 (2024-7-30 07:48):
更新demo,支持【长整数型】和【双精度小数型】传递,请往下翻贴↓↓↓ |