开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

楼主: 笨来无一悟
收起左侧

[易语言纯源码] 【蠢新学汇编】整数数组 取最大最小

[复制链接]
发表于 2025-2-24 01:04:11 | 显示全部楼层   河北省张家口市
笨来无一悟 发表于 2025-2-24 00:58
你原来的写法是-4 汇编里面又+4 不减不就可以不加了嘛
  
[/quote]
是的老师,我想的就是汇编里面加好了外面就不用加减了,更快,这样就没问题了{:7_456:}
[e=1].版本 2
子程序名返回值类型公开备 注
取大整数型 将压入的数据排序取最大的
_取数组地址 (数组)
' __asm{
' push esi
' push ecx
' push edx
'  mov ESI, eax
' MOV ECX,[ESI]
' TEST ECX,ECX
' JE exit
' XOR EAX ,EAX
' s:
' MOV EDX,[ESI+ECX*4]
' CMP EDX,EAX
' JLE ignore
' MOV EAX, EDX
' ignore:
' LOOP s
' exit:
'  pop edx
'  pop ecx
'  pop esi
' LEAVE
' RET 4
' }



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

点评

子程序结合汇编 一般不需要用等号= 反正执行完毕结果就在EAX里面 紧接着写汇编代码就成 变量是内存 EAX这些是寄存器 直接用寄存器比内存快   贵州省毕节市  发表于 2025-2-24 01:23
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2025-2-24 01:01:26 | 显示全部楼层   河北省张家口市
咱取大小不就是需要成员数嘛老师,所以我+4取成员数,我就说怎么取不到正确的,原来会隐一个,谢谢恩师!
像数组成员数,和地址这些信息怎么知道阿老师,我很难找到相关资料

点评

可以查看易语言生成的汇编代码 写这个工具就是为了看类怎么不对 一看 原来隐式传递了一个   贵州省毕节市  发表于 2025-2-24 01:12
【蠢新学汇编】截取 子程序代码 字节集片段 https://bbs.125.la/forum.php?mod=viewthread&tid=14831407   贵州省毕节市  发表于 2025-2-24 01:11
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 3 天

 楼主| 发表于 2025-2-24 00:58:54 | 显示全部楼层   贵州省毕节市
萧楚楠 发表于 2025-2-23 21:47
老师,我发现一个很蛋疼的事,就是把他写到类里面是取不到正确的地址的,但是放到程序集里面就行,真的蛋疼 ...

你原来的写法是-4 汇编里面又+4 不减不就可以不加了嘛
  
子程序名返回值类型公开备 注
取大整数型 将压入的数据排序取最大的
取变量数据地址 (数组)  ' 此时结果已经保存在EAX里面了
' __asm{
' push esi
' push ecx
' push edx
' mov ESI, EAX  ;EAX的值存ESI
' MOV ECX,[ESI]
' TEST ECX,ECX
' JE exit
' XOR EAX ,EAX
' s:
' MOV EDX,[ESI+ECX*4]
' CMP EDX,EAX
' JLE ignore
' MOV EAX, EDX
' ignore:
' LOOP s
' exit:
'  pop edx
'  pop ecx
'  pop esi
' LEAVE
' RET 4
' }
返回 (1)


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

点评

如果成员数不对的话 可以试试 ' MOV ECX,[ESI-4] 反正需要修改的地方最多两处   贵州省毕节市  发表于 2025-2-24 01:02
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2025-2-23 23:23:42 | 显示全部楼层   广东省东莞市
        忘记评分了 哈哈
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2025-2-23 21:47:47 | 显示全部楼层   河北省张家口市
老师,我发现一个很蛋疼的事,就是把他写到类里面是取不到正确的地址的,但是放到程序集里面就行,真的蛋疼,不知道啥原因
  
窗口程序集名保 留  保 留备 注
类_数值运算   
变量名类 型数组备 注
数组整数型0 

子程序名返回值类型公开备 注
_初始化 当基于本类的对象被创建后,此方法会被自动调用
加入成员 (数组, 1)
加入成员 (数组, 1)
加入成员 (数组, 1)
加入成员 (数组, 1)
子程序名返回值类型公开备 注
_销毁 当基于本类的对象被销毁前,此方法会被自动调用

子程序名返回值类型公开备 注
取大整数型 将压入的数据排序取最大的
变量名类 型静态数组备 注
num整数型 
num = 取变量数据地址 (数组) - 4
调试输出 (_取数组地址 (数组)=num) ’ 这个_取数组地址()只有放在程序集里面才能取对,在类里面取不对,啥原理阿老师
' __asm{
' push esi
' push ecx
' push edx
'  mov ESI, dword ptr ds:[ebp-4]       ; 解引用得到实际结构体地址
' ADD ESI,4
' MOV ECX,[ESI]
' TEST ECX,ECX
' JE exit
' XOR EAX ,EAX
' s:
' MOV EDX,[ESI+ECX*4]
' CMP EDX,EAX
' JLE ignore
' MOV EAX, EDX
' ignore:
' LOOP s
' exit:
'  pop edx
'  pop ecx
'  pop esi
' LEAVE
' RET 4
' }
返回 (1)
子程序名返回值类型公开备 注
_取数组地址整数型 
参数名类 型参考可空数组备 注
a整数型
' ;置入代码 ({ 139, 69, 8, 201, 194, 4, 0 })
' __asm{
' mov eax, dword ptr ss:[ebp+0x08]
' mov eax,[eax]
' lea eax,[eax+4]
' leave
' ret 0x04
' }
返回 (2)


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

点评

+4 应该是数组成员数的指针 你要取什么 拿着易语言原生的命令对比一下结果   贵州省毕节市  发表于 2025-2-24 00:48
置入代码 ({ 139, 69, 12, 201, 194, 8, 0 })   贵州省毕节市  发表于 2025-2-24 00:45
然后 类的汇编 ret的时候 也要多弹出4字 ret 8 才对   贵州省毕节市  发表于 2025-2-24 00:30
类方法 隐式传递了一个参数 你用+12 别用+8   贵州省毕节市  发表于 2025-2-24 00:29
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2025-2-23 21:07:16 | 显示全部楼层   河北省张家口市
笨来无一悟 发表于 2025-2-23 20:50
[e=4].版本 2
.支持库 spec

学到了,谢谢老师,方便请教下取整数型数组地址的代码该怎么写吗?

' mov eax,[ebp+8h]
' mov eax,[eax]
' pop ebp
' ret 4
这样取不到

点评

第三行少一句 mov eax,[eax+8]一维数组首成员地址 +4是数组成员数   贵州省毕节市  发表于 2025-2-23 21:22
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 3 天

 楼主| 发表于 2025-2-23 20:50:53 | 显示全部楼层   贵州省毕节市
萧楚楠 发表于 2025-2-23 20:34
跟着大佬学会了很多,来交个笔记,我封装成类方便了一点点调用,就不需要加入成员(数组,数据)了,只需要 ...
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
数组整数型5 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
测试整数型 
调试输出 (取变量地址 (数组), “常规”)
取变量地址 (数组)
置入代码 ({ 137, 69, 252 })
' MOV [EBP-4],EAX
调试输出 (测试, “汇编”)


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

回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2025-2-23 20:34:57 | 显示全部楼层   河北省张家口市
跟着大佬学会了很多,来交个笔记,我封装成类方便了一点点调用,就不需要加入成员(数组,数据)了,只需要压入,然后进行相应操作
  
窗口程序集名保 留  保 留备 注
类_数值运算  无符号整数的汇编运算
变量名类 型数组备 注
数组整数型0 

子程序名返回值类型公开备 注
_初始化 当基于本类的对象被创建后,此方法会被自动调用

子程序名返回值类型公开备 注
_销毁 当基于本类的对象被销毁前,此方法会被自动调用

子程序名返回值类型公开备 注
压入数据 先压入数据才能进行相应运算
参数名类 型参考可空数组备 注
欲压入数据整数型
加入成员 (数组, 欲压入数据)
子程序名返回值类型公开备 注
相加整数型 将压入的数据全部相加求和
变量名类 型静态数组备 注
num整数型 
num = 取变量数据地址 (数组) - 4
' __asm{
' ; push edx
' ; push ecx
' ; push ebx
' ; mov edx,[ebp-4]
' ; mov ecx, dword ptr ds:[edx]  ; 读取(数组成员数)
' ; test ecx, ecx                     ; 检查数组长度是否为0
' ; je exit                     ; 如果长度为0,跳转到返回0的代码
' ; xor eax,eax
' ; star:
' ; mov ebx, dword ptr ds:[edx+ecx*4] ; 按逆序加载数组元素(从最后一个开始)
' ; add eax, ebx                      ; 求和
' ; loop star                   ; 循环处理所有元素
' ; exit:
' ; pop ebx
' ; pop ecx
' ; pop edx
' ; leave                         ; leave = mov esp,ebp + pop ebp
' ; ret 4
置入代码 ({ 82, 81, 83, 139, 85, 252, 62, 139, 10, 133, 201, 116, 10, 49, 192, 62, 139, 28, 138, 1, 216, 226, 248, 91, 89, 90, 201, 194, 4, 0 })
' }
返回 (666)
子程序名返回值类型公开备 注
取大整数型 将压入的数据排序取最大的
变量名类 型静态数组备 注
num整数型 
num = 取变量数据地址 (数组) - 4
' __asm{
' ; push esi
' ; push ecx
' ; push edx
' ;  mov ESI, dword ptr ds:[ebp-4]       ; 解引用得到实际结构体地址
' ; ADD ESI,4
' ; MOV ECX,[ESI]
' ; TEST ECX,ECX
' ; JE exit
' ; XOR EAX ,EAX
' ; s:
' ; MOV EDX,[ESI+ECX*4]
' ; CMP EDX,EAX
' ; JLE ignore
' ; MOV EAX, EDX
' ; ignore:
' ; LOOP s
' ; exit:
' ;  pop edx
' ;  pop ecx
' ;  pop esi
' ; LEAVE
' ; RET 4
置入代码 ({ 86, 81, 82, 62, 139, 117, 252, 131, 198, 4, 139, 14, 133, 201, 116, 13, 49, 192, 139, 20, 142, 57, 194, 126, 2, 137, 208, 226, 245, 90, 89, 94, 201, 194, 4, 0 })
' }
返回 (666)
子程序名返回值类型公开备 注
取小整数型 将压入的数据排序取最小的
变量名类 型静态数组备 注
num整数型 
num = 取变量数据地址 (数组) - 4
' __asm{
' ; push esi
' ; push ecx
' ; push edx
' ;  mov eax, dword ptr ds:[ebp-4]       ; 解引用得到实际结构体地址
' ;  mov ecx, dword ptr ds:[eax+0x04]  ; 读取结构体+0x04处的值(数组长度)
' ;  test ecx, ecx                     ; 检查数组长度是否为0
' ;  je exit                     ; 如果长度为0,退出
' ;  lea esi, dword ptr ds:[eax+0x04]  ; 将esi指向结构体+0x04(数组长度字段)
' ;  mov edx, dword ptr ds:[eax+0x08]  ; 初始化edx为第一个数组元素的值
' ;  s:
' ;  mov eax, dword ptr ds:[esi+ecx*4] ; 按逆序加载数组元素(从最后一个开始)
' ;  cmp eax, edx                      ; 比较当前元素与当前最小值
' ;  jge ignore                    ; 如果当前元素 >= 当前最小值,跳过更新
' ;  mov edx, eax                      ; 否则更新当前最小值为当前元素
' ;  ignore:                      ;到循环尾
' ;  loop s                   ; 循环处理所有元素
' ;  mov eax, edx                      ; 将最终最小值存入eax作为返回值
' ;  leave                             ; 恢复栈帧
' ;  ret 0x04                          ; 返回并清理参数
' ;  exit:
' ;  xor eax, eax                      ; 返回0(处理空数组情况)
' ;  pop edx
' ;  pop ecx
' ;  pop esi
' ;  leave
' ;  ret 0x04
置入代码 ({ 86, 81, 82, 62, 139, 69, 252, 62, 139, 72, 4, 133, 201, 116, 26, 62, 141, 112, 4, 62, 139, 80, 8, 62, 139, 4, 142, 57, 208, 125, 2, 137, 194, 226, 244, 137, 208, 201, 194, 4, 0, 49, 192, 90, 89, 94, 201, 194, 4, 0 })
'  }
返回 (666)


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

点评

这样就可以不用局部变量   贵州省毕节市  发表于 2025-2-23 20:55
20楼的例子 说明 不需要局部变量 你直接写一句 取变量数据地址(数组) 然后值就在EAX里面了 你的mov edx,[ebp-4]改成 lea edx,[eax+4] 等效   贵州省毕节市  发表于 2025-2-23 20:55
num = 取变量数据地址 (数组) - 4 等号是多余的 执行了取变量地址 变量数据地址这些 地址就保存在EAX寄存器里面了 不用等号 可以更快   贵州省毕节市  发表于 2025-2-23 20:46
求和 看第33楼 代码比一楼的多 但是速度翻倍   贵州省毕节市  发表于 2025-2-23 20:39
【蠢新学汇编】整数型数组 快速求和 https://bbs.125.la/forum.php?mod=viewthread&tid=14801323   贵州省毕节市  发表于 2025-2-23 20:37
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)

签到天数: 2 天

发表于 2025-2-23 20:04:06 | 显示全部楼层   四川省泸州市
整数数组 取最大最小
回复 支持 反对

使用道具 举报

发表于 2025-2-23 17:17:54 | 显示全部楼层   北京市北京市
怎么把汇编转为字节码的?

点评

https://pan.baidu.com/share/init?surl=ahxa-SZqqU4sW4YL38XAZQ&pwd=9g6a   贵州省毕节市  发表于 2025-2-23 17:47
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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