开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 4210|回复: 12
收起左侧

[易语言纯源码] 汇编_取类中变量地址 ; 乘法

[复制链接]
结帖率:93% (14/15)
发表于 2016-3-23 11:01:40 | 显示全部楼层 |阅读模式   广东省*
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 呵呵仙 于 2016-3-23 11:05 编辑

取类中变量地址,得到变量地址,并非没用,可以直接改变相关的数据.


ASM4(取类中变量地址).rar (7.29 KB, 下载次数: 67)

评分

参与人数 1好评 +1 精币 +5 收起 理由
冰点 + 1 + 5 感谢发布原创作品,精易因你更精彩!

查看全部评分


签到天数: 10 天

发表于 2022-8-16 13:36:39 | 显示全部楼层   广东省广州市
谢谢分享
回复 支持 反对

使用道具 举报

签到天数: 4 天

发表于 2016-11-15 21:05:57 | 显示全部楼层   山西省临汾市
非常不错!谢谢
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2016-3-26 20:08:09 | 显示全部楼层   广东省广州市
呵呵仙 发表于 2016-3-26 19:24
[e=1].版本 2

.子程序 取类中变量地址_ASM, 整数型

这样是没问题的。别人说的崩溃估计是没释放原来的指针。是别人的问题
因为易语言中,非基本数据类型都是以指针方式储存的,比如a类中有个成员b为文本型,那么取到成员b的指针的值,实际为一个指针,指向一串以\0为结束标记的文本。如果用此方法置入新值而不释放原来的文本指针。内存飙升算是轻的了

点评

我哪几个交换变量.不用手工释放.软件会依自身是否局部变量自动释放的.所以可以起到主程序不停的可以调DLL写好的类.内存又不会狂增不减.   广东省东莞市  发表于 2016-3-26 20:40

评分

参与人数 1好评 +1 精币 +1 收起 理由
呵呵仙 + 1 + 1 谢谢,学习了.

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:93% (14/15)

签到天数: 22 天

 楼主| 发表于 2016-3-26 19:24:36 | 显示全部楼层   广东省东莞市
本帖最后由 呵呵仙 于 2016-3-26 19:51 编辑

多发了一贴
回复 支持 反对

使用道具 举报

结帖率:93% (14/15)

签到天数: 22 天

 楼主| 发表于 2016-3-26 19:24:16 | 显示全部楼层   广东省东莞市
本帖最后由 呵呵仙 于 2016-3-26 19:26 编辑
  
子程序名返回值类型公开备 注
取类中变量地址_ASM整数型 
参数名类 型参考可空数组备 注
类变量通用型类变量
第几个变量整数型取类中的第几个变量地址
置入代码 ({ 139, 69, 8, 139, 8, 139, 69, 12, 107, 192, 4, 1, 200, 201, 194, 8, 0 })
返回 (0)
' mov eax,[ebp+8]
' mov ecx,[eax]
' mov eax,[ebp+12]
' IMUL eax,4
' add  eax,ecx
' leave
' retn 8
' 谢谢,我是这样写的不知可不可以?

回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2016-3-26 18:45:11 | 显示全部楼层   广东省广州市
本帖最后由 肉鱼 于 2016-3-26 18:48 编辑

也可以这样,方法是一样的,没有乱用寄存
  
子程序名返回值类型公开备 注
取私有成员指针整数型 
参数名类 型参考可空数组备 注
通用型
成员索引 
置入代码 ({ 139, 24, 139, 69, 12, 185, 4, 0, 0, 0, 247, 225, 1, 216, 201, 194, 8, 0 })
' mov ebx,[eax]
' mov eax,[ebp+0Ch]
' mov ecx,4
' mul ecx
' add eax,ebx
' leave
' ret 8
返回 (0)
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2016-3-26 18:39:29 | 显示全部楼层   广东省广州市
本帖最后由 肉鱼 于 2016-3-27 21:19 编辑

如图所示,如果知道了类的This,This+0指向的地址是类的函数指针集,+4就是私有成员1的指针,+8就是成员2的指针。这样可以直接用乘法算。

回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2016-3-26 18:36:18 | 显示全部楼层   广东省广州市
呵呵仙 发表于 2016-3-25 23:14
你的英文子程序,还是看不明白.有人说我这个取类中变量地址_asm().乱用寄存器,以后会各种崩,我应 ...

没下载你的代码,但是我拷贝的代码中第一个子程序就是取类私有成员指针的:
返回 (指针到整数 (lpThis) + 4 × index)
回复 支持 反对

使用道具 举报

结帖率:93% (14/15)

签到天数: 22 天

 楼主| 发表于 2016-3-25 23:14:57 | 显示全部楼层   广东省东莞市
肉鱼 发表于 2016-3-25 19:35
此处用汇编和直接算效率相差不大,另外调用一个函数后寄存器基本“小命不保”,实在想保存寄存器的值可以先 ...

你的英文子程序,还是看不明白.有人说我这个取类中变量地址_asm().乱用寄存器,以后会各种崩,我应该如何改进呢?谢谢
但是,我又试过N次计次和再次赋值也没出错.
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2016-3-25 19:35:16 | 显示全部楼层   广东省广州市
本帖最后由 肉鱼 于 2016-3-25 19:37 编辑

不用汇编写法:

  
窗口程序集名保 留  保 留备 注
程序集_ObjSdk   
变量名类 型数组备 注
m_ThisObj0 
m_dwTypeObj0 

子程序名返回值类型公开备 注
Obj_lpData整数型 
参数名类 型参考可空数组备 注
lpThis 
index 
如果真 (lpThis ≠ 0)
返回 (指针到整数 (lpThis) + 4 × index)
返回 (0)
子程序名返回值类型公开备 注
Obj_GetData整数型 
参数名类 型参考可空数组备 注
lpThis 
index 
变量名类 型静态数组备 注
lpData  
lpData = Obj_lpData (lpThis, index)
如果真 (lpData ≠ 0)
返回 (指针到整数 (lpData))
返回 (0)
子程序名返回值类型公开备 注
Obj_SetData整数型 
参数名类 型参考可空数组备 注
lpThis 
index 
dwValue 
变量名类 型静态数组备 注
lpData  
dwLast  
lpData = Obj_lpData (lpThis, index)
如果真 (lpData ≠ 0)
dwLast = 指针到整数 (lpData)
写到内存 (dwValue, lpData, )
返回 (dwLast)
子程序名返回值类型公开备 注
Obj_SetThis整数型 成功返回LastThisDest
参数名类 型参考可空数组备 注
lpThisDest 
lpThisSrc只需要一个指向ThisSrc的指针即可,不必要求一定是对象本身的lpThis
变量名类 型静态数组备 注
LastThis  
如果真 (lpThisDest = 0 lpThisSrc = 0)
返回 (0)
LastThis = 指针到整数 (lpThisDest)
写到内存 (指针到整数 (lpThisSrc), lpThisDest, )
返回 (LastThis)
子程序名返回值类型公开备 注
Obj_GetMethodAddr整数型 
参数名类 型参考可空数组备 注
lpThis 
index 
如果真 (lpThis ≠ 0)
返回 (指针到整数 (指针到整数 (指针到整数 (lpThis)) + index × 4))
返回 (0)
子程序名返回值类型公开备 注
Obj_CallMethod整数型 
参数名类 型参考可空数组备 注
lpThis 
index 
Param01
Param02
Param03
Param04
Param05
Param06
Param07
Param08
Param09
Param10
Param11
Param12
Param13
Param14
变量名类 型静态数组备 注
addr  
如果真 (lpThis = 0)
返回 (0)
addr = Obj_GetMethodAddr (lpThis, index)
如果真 (addr = 0)
返回 (0)
返回 (Call (addr, lpThis, Param01, Param02, Param03, Param04, Param05, Param06, Param07, Param08, Param09, Param10, Param11, Param12, Param13, Param14))
子程序名返回值类型公开备 注
Obj_Regist逻辑型 
参数名类 型参考可空数组备 注
dwTypeObj 
lpThisObj 
变量名类 型静态数组备 注
i  
This-8
如果真 (lpThisObj = 0 BinSearch (m_dwTypeObj, dwTypeObj, i) ≠ 0)
返回 ()
插入成员 (m_dwTypeObj, i, dwTypeObj)
This = 指针到整数 (lpThisObj)
置入代码 ({ 139, 69, 248, 139, 24, 255, 83, 4, 137, 69, 248 })
' mov eax,[ebp-8]
' mov ebx,[eax]
' call dword [ebx+4]
' mov [ebp-8],eax
插入成员 (m_ThisObj, i, This)
返回 ()
子程序名返回值类型公开备 注
Obj_Unregist逻辑型 
参数名类 型参考可空数组备 注
dwTypeObj 
变量名类 型静态数组备 注
i  
lpThis  
i = BinSearch (m_dwTypeObj, dwTypeObj)
如果真 (i = 0)
返回 ()
lpThis = GetStackPtr (m_ThisObj [i])
如果真 (Obj_Destroy (lpThis))
删除成员 (m_dwTypeObj, i, )
删除成员 (m_ThisObj, i, )
返回 ()
返回 ()
子程序名返回值类型公开备 注
Obj_UnregistAll 

子程序名返回值类型公开备 注
Obj_Create整数型 创建一个已注册的类,成功返回lpThis,失败返回0
参数名类 型参考可空数组备 注
dwObjType 
变量名类 型静态数组备 注
i  
This  
i = BinSearch (m_dwTypeObj, dwObjType)
如果真 (i = 0)
返回 (0)
This = m_ThisObj [i]
置入代码 ({ 139, 69, 248, 139, 24, 255, 83, 4, 137, 69, 248 })
' mov eax,[ebp-8]
' mov ebx,[eax]
' call dword [ebx+4]
' mov [ebp-8],eax
i = 申请内存_ (4)
如果真 (i ≠ 0)
写到内存 (This, i, )
返回 (i)
子程序名返回值类型公开备 注
Obj_Destroy逻辑型 
参数名类 型参考可空数组备 注
lpThis 
变量名类 型静态数组备 注
This  
如果真 (lpThis = 0)
返回 ()
This = 指针到整数 (lpThis)
置入代码 ({ 139, 69, 252, 139, 24, 141, 69, 252, 80, 255, 83, 8 })
' mov eax,[ebp-4]
' mov ebx,[eax]
' lea eax,[ebp-4]
' push eax
' call dword [ebx+8]
释放内存_ (lpThis)
返回 (释放内存_ (This))
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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