精易论坛

标题: 【蠢新学汇编】对"类方法指针"进行包装 [打印本页]

作者: 笨来无一悟    时间: 2024-8-14 22:15
标题: 【蠢新学汇编】对"类方法指针"进行包装
类方法和子程序的真实地址 调用子程序()的方式 返回值都会不正确
想模拟一个易语言的包装函数出来玩玩 几经测试都以失败告终


调用子程序的时候返回值不正确的话 手动添加两行汇编代码 保护一下 EBX 寄存器

  
置入代码 ({ 83 })  ' PUSH EBX
' 用户代码
置入代码 ({ 91 })  ' POP EBX



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

  
子程序名返回值类型公开备 注
取类方法地址整数型 初始化销毁以外 从1开始
参数名类 型参考可空数组备 注
已声明类变量通用型已声明类变量名称
类方法上到下整数型所取编号必须存在
变量名类 型静态数组备 注
局_返回整数型静态
局_地址整数型静态
局_代码字节集静态
置入代码 ({ 81, 54, 139, 77, 12, 54, 139, 69, 8, 62, 139, 0, 62, 139, 0, 62, 139, 68, 136, 4, 137, 69, 12, 89 })
局_地址 = 类方法上到下
局_代码 = { 139, 4, 36, 163 }到字节集 (取变量数据地址 (局_返回)) + { 255, 21 }到字节集 (取变量数据地址 (局_地址)) + { 255, 37 }到字节集 (取变量数据地址 (局_返回))
返回 (取变量数据地址 (局_代码))  


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


[groupid=227]热心网友[/groupid]

取类方法指针.e

11.38 KB, 下载次数: 18, 下载积分: 精币 -2 枚

详细测试用例


作者: xtd小土豆    时间: 2024-8-14 22:43
感谢分享~
作者: 龙傲天f    时间: 2024-8-14 22:50
感谢分享,很给力!~
作者: dnxl    时间: 2024-8-14 23:07
类方法第一个参数是类指针,调用方法返回值都没什么问题吧
作者: xiehuajieaa    时间: 2024-8-14 23:24
感谢分享…
作者: renhe2018    时间: 2024-8-15 00:11
支持一下,赞。
作者: dnxl    时间: 2024-8-15 00:31
dnxl 发表于 2024-8-14 23:07
类方法第一个参数是类指针,调用方法返回值都没什么问题吧




下面是调用类中子程序1,复杂点的参数也没有任何问题。





作者: ctry78985    时间: 2024-8-15 07:06
感谢分享
作者: 查过    时间: 2024-8-15 07:58
感谢分享,很给力!~
作者: 豆豆灰常开心    时间: 2024-8-15 08:03
下个学习一下
作者: 夜曦丫    时间: 2024-8-15 08:39
下个学习一下
作者: 何浩文    时间: 2024-8-15 08:56
感谢发布原创作品,精易因你更精彩
作者: 一指温柔    时间: 2024-8-15 09:27
感谢分享
作者: baitso    时间: 2024-8-15 11:13
支持开源~!感谢分享
作者: 胖子葛格    时间: 2024-8-15 18:09
感谢大神分享~@!
作者: 396384183    时间: 2024-8-16 00:25
论坛有你更精彩
作者: futiem    时间: 2024-8-16 06:40
感谢大神分享~@!
作者: 一指温柔    时间: 2024-8-16 09:08
支持开源~!感谢分享
作者: please    时间: 2024-8-16 09:38
感谢分享,支持开源!!!
作者: 虎子666    时间: 2024-10-13 13:45
感谢分享
作者: 熊不熊    时间: 2024-12-4 18:33
感谢分享,很给力!~
作者: 真IKUN    时间: 2025-2-13 08:15
确实很先进,学到了,谢谢悟哥,以后别点评呀,要不然回复不了,还想跟老哥多请教点
作者: 笨来无一悟    时间: 2025-2-13 10:52
真IKUN 发表于 2025-2-13 08:15
确实很先进,学到了,谢谢悟哥,以后别点评呀,要不然回复不了,还想跟老哥多请教点 ...

子程序 比类更快 原生支持多线程能用子程序跑多线程的就不用类
  
数据类型名公开备 注
自定义 
成员名类 型传址数组备 注
成员一整数型  
成员二双精度小数型  


  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
地址整数型 
地址 = 取某某子程序地址 ()
调用子程序 (地址, , , 0, 0)  ' 自定义数据类型 取变量地址() 取变量数据地址()
子程序名返回值类型公开备 注
取某某子程序地址整数型 针对 参数为 字节集 数组 或者 自定义类型
变量名类 型静态数组备 注
A自定义 
B字节集 
返回 (下层地址 ())  ' 除了局部自定义非静态 别的都能获取 因为局部非静态自定义数据会call一个 构造函数(自定义数据类型初始化)
某某子程序 (A, B)
子程序名返回值类型公开备 注
某某子程序整数型 
参数名类 型参考可空数组备 注
自定义
字节集
调试输出 (“被调用”)
返回 (0)
子程序名返回值类型公开备 注
下层地址整数型 返回(下层地址()) 所取子程序(须带参数,来源不限) 若传局部变量必须静态
置入代码 ({ 83, 81, 82, 139, 69, 4 })
' PUSH EBX
' PUSH ECX
' PUSH EDX
' MOV EAX,DWORD [EBP+4]
置入代码 ({ 64, 128, 56, 195, 117, 34, 128, 120, 255, 93, 117, 244, 128, 120, 254, 229, 117, 8, 128, 120, 253, 139, 117, 232, 235, 50 })
' 向下:
' INC EAX
' CMP BYTE[EAX],195
' JNE 带参
' 平栈:
' CMP BYTE[EAX-1],93
' JNE 向下
' CMP BYTE[EAX-2],229
' JNE 等价
' CMP BYTE[EAX-3],139
' JNE 向下
' JMP 向上
置入代码 ({ 128, 120, 254, 236, 117, 224, 128, 120, 253, 137, 117, 218, 235, 36 })
' 等价:
' CMP BYTE[EAX-2],236
' JNE 向下
' CMP BYTE[EAX-3],137
' JNE 向下
' JMP 向上
置入代码 ({ 128, 56, 194, 117, 211, 128, 120, 2, 0, 117, 205, 137, 193, 80, 49, 210, 49, 192, 138, 65, 1, 187, 4, 0, 0, 0, 247, 243, 88, 131, 250, 0, 117, 182, 235, 186 })
' 带参:
' CMP BYTE[EAX],194
' JNE 向下
' CMP BYTE [EAX+2],0
' JNE 向下
' MOV ECX,EAX
' PUSH EAX
' XOR EDX,EDX
' XOR EAX,EAX
' MOV AL,BYTE [ECX+1]
' MOV EBX,4
' DIV EBX
' POP EAX
' CMP EDX,0
' JNE 向下
' JMP 平栈
置入代码 ({ 72, 128, 56, 232, 117, 250, 128, 120, 251, 104, 117, 2, 235, 12 })
' 向上:
' DEC EAX
' CMP BYTE [EAX],232
' JNE 向上
' CMP BYTE[EAX-5],104
' JNE 传参
' JMP 找到
置入代码 ({ 128, 120, 253, 255, 117, 236, 128, 120, 254, 117, 117, 230, 139, 72, 1, 141, 76, 8, 5, 128, 57, 85, 117, 218 })
' 传参:
' CMP BYTE[EAX-3],255
' JNE 向上
' CMP BYTE[EAX-2],117
' JNE 向上
' 找到:
' MOV ECX,DWORD [EAX+1]
' LEA ECX,DWORD [EAX+ECX+5]
' CMP BYTE [ECX],85
' JNE 向上
置入代码 ({ 137, 200, 90, 89, 91, 201, 195 })
' MOV EAX,ECX
' POP EDX
' POP ECX
' POP EBX
' LEAVE
' RET
返回 (0)
子程序名返回值类型公开备 注
下层地址_简版整数型 返回(下层地址_简版()) 所取子程序(须带参数,且,来自局部) 需传静态变量
置入代码 ({ 81, 139, 69, 4, 64, 128, 56, 232, 117, 250, 128, 120, 251, 104, 117, 244, 139, 72, 1, 141, 76, 8, 5, 128, 57, 85, 117, 232, 137, 200, 89, 201, 195 })
返回 (0)
' PUSH ECX
' MOV EAX, DWORD [EBP+4]
' 向下:
' INC EAX
' CMP BYTE[EAX],232
' JNE 向下
' CMP BYTE[EAX-5],104
' JNE 向下
' MOV ECX, DWORD [EAX+1]
' LEA ECX, DWORD [EAX+ECX+5]
' CMP BYTE [ECX],85
' JNE 向下
' MOV EAX, ECX
' POP ECX
' LEAVE
' RET



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


作者: 真IKUN    时间: 2025-2-13 12:26
笨来无一悟 发表于 2025-2-13 10:52
子程序 比类更快 原生支持多线程能用子程序跑多线程的就不用类
[e=4].版本 2

更先进了谢谢悟哥,功德无量
作者: 笨来无一悟    时间: 2025-4-1 19:17
  
窗口程序集名保 留  保 留备 注
类方法   
子程序名返回值类型公开备 注
取类方法内部子程序指针 初始化销毁以外 从1开始
参数名类 型参考可空数组备 注
类方法上到下整数型所取编号必须存在
存放代码变量字节集生命周期之内使用
存放代码变量 = { 255, 52, 36, 199, 68, 36, 4, 0, 0, 0, 0, 184, 0, 0, 0, 0, 255, 224 }
置入代码 ({ 139, 69, 12, 139, 0, 131, 192, 8, 54, 139, 85, 0, 62, 139, 82, 8, 62, 137, 80, 7, 62, 139, 18, 62, 139, 18, 54, 139, 77, 8, 62, 139, 84, 138, 4, 62, 137, 80, 12, 201, 194, 8, 0 })
' MOV EAX, DWORD [EBP+12]
' MOV EAX, DWORD [EAX]
' ADD EAX, 8
' MOV EDX, DWORD PTR SS:[EBP]
' MOV EDX, DWORD PTR DS:[EDX+8]
' MOV DWORD PTR DS:[EAX+7], EDX
' MOV EDX, DWORD PTR DS:[EDX]
' MOV EDX, DWORD PTR DS:[EDX]
' MOV ECX, DWORD PTR SS:[EBP+8]
' MOV EDX, DWORD PTR DS:[EDX+ECX*4+4]
' MOV DWORD PTR DS:[EAX+12], EDX
' LEAVE
' RET 8
返回 (&欺骗编译器)  ' 已包装 仅供 类内部 调用
子程序名返回值类型公开备 注
取类方法外部子程序指针 初始化销毁以外 从1开始
参数名类 型参考可空数组备 注
已声明类变量通用型已声明类变量名称
类方法上到下整数型所取编号必须存在
存放代码变量字节集生命周期之内使用
存放代码变量 = { 255, 52, 36, 199, 68, 36, 4, 0, 0, 0, 0, 184, 0, 0, 0, 0, 255, 224 }
置入代码 ({ 139, 69, 16, 139, 0, 131, 192, 8, 54, 139, 85, 8, 54, 137, 80, 7, 62, 139, 18, 62, 139, 18, 54, 139, 77, 12, 62, 139, 84, 138, 4, 54, 137, 80, 12, 201, 194, 12, 0 })
' MOV EAX, DWORD [EBP+16]
' MOV EAX, DWORD [EAX]
' ADD EAX, 8
' MOV EDX, DWORD PTR SS:[EBP+8]
' MOV DWORD PTR SS:[EAX+7], EDX
' MOV EDX, DWORD PTR DS:[EDX]
' MOV EDX, DWORD PTR DS:[EDX]
' MOV ECX, DWORD PTR SS:[EBP+12]
' MOV EDX, DWORD PTR DS:[EDX+ECX*4+4]
' MOV DWORD PTR SS:[EAX+12], EDX
' LEAVE
' RET 12
返回 (&欺骗编译器)  ' 已包装 仅供 类外部 调用
子程序名返回值类型公开备 注
欺骗编译器子程序指针 
返回 (&欺骗编译器)
子程序名返回值类型公开备 注
取类方法地址整数型 初始化销毁以外 从1开始
参数名类 型参考可空数组备 注
已声明类变量通用型已声明类变量名称
类方法上到下整数型所取编号必须存在
置入代码 ({ 81, 139, 77, 12, 139, 69, 8, 139, 0, 139, 0, 139, 68, 136, 4, 89, 201, 194, 8, 0 })  ' 原版 暂弃
返回 (0)  ' 无包装 若引用 PUSH参数之后需多PUSH一个(类变量地址)
' PUSH ECX
' MOV ECX, DWORD PTR SS:[EBP+0X0C]
' MOV EAX, DWORD PTR SS:[EBP+0X08]
' MOV EAX, DWORD PTR DS:[EAX]
' MOV EAX, DWORD PTR DS:[EAX]
' MOV EAX, DWORD PTR DS:[EAX+ECX*4+0X04]
' POP ECX
' LEAVE
' RET 0X08
子程序名返回值类型公开备 注
跳转 类方法 跳转  仅示例 勿引用
变量名类 型静态数组备 注
跳转字节集 
跳转 = { 91, 184, 0, 0, 0, 0, 104, 0, 0, 0, 0, 83, 255, 224 }
' POP EBX
' MOV EAX, 0X00000000
' PUSH 0X00000000
' PUSH EBX
' JMP EAX
跳转 = { 255, 52, 36, 199, 68, 36, 4, 0, 0, 0, 0, 184, 0, 0, 0, 0, 255, 224 }
' PUSH DWORD [ESP]
' MOV DWORD [ESP+0X04], 0X00000000
' MOV EAX, 0X00000000
' JMP EAX







欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4