开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 256|回复: 3
收起左侧

[已解决] 汇编堆栈平衡问题

 关闭 [复制链接]
结帖率:68% (17/25)
发表于 2024-11-8 09:01:21 | 显示全部楼层 |阅读模式   湖南省怀化市
5精币
精易模块中的调用子程序 屏幕截图 2024-11-08 081710.png
16行:这里为什么要从栈上弹出124字节,这个是怎么计算的,参数总计16个为什么不是16*4,或15*4
假设这个“调用子程序”没有参数,我push了2个立即数来调用加法运算,这里需要平衡栈吗,什么情况下需要,需要的情况下怎么计算,什么情况下不需要


AI解说:srdcall 调用约定
在 stdcall 调用约定中,函数的参数从右到左依次压入栈中。被调用的函数负责在返回之前清理栈上的参数。这意味着,当函数执行完毕后,它会使用 ret 指令并附带一个立即数来弹出所有由该函数压入的参数。这个立即数通常等于所有参数所占用的总字节数





  • 00000000 56 push esi:将esi寄存器的值压入栈中。esi通常用于字符串和数组操作中的索引或指针。
  • 00000001 BE0F000000 mov esi,0xf:将值0xf(即15)移动到esi寄存器中。这里esi可能被用作循环计数器或数组索引。
  • 00000006 8D4D08 lea ecx,[ebp+0x8]:将ebp+0x8的地址加载到ecx寄存器中。ebp是基指针寄存器,常用于访问栈上的局部变量,这里[ebp+0x8]可能是一个指向局部变量的指针或数组的开始。
  • 00000009 8D4CF1FC lea ecx,[ecx+esi*8-0x4]:计算新的ecx值,这里是基于当前ecx值(来自上一步)、esi寄存器的值乘以8(可能是因为数组的每个元素大小是8字节),然后减去4。这通常用于访问数组或结构体的元素。
  • 0000000D 8B4104 mov eax,[ecx+0x4]:将ecx+0x4地址处的值移动到eax寄存器中。这可能是访问一个结构体或数组的特定成员。
  • 00000010 85C0 test eax,eax:进行逻辑与操作来测试eax的值,主要用于设置条件码(如零标志ZF)。
  • 00000012 7402 jz 0x16:如果eax为零(ZF=1),则跳转到地址0x16。
  • 00000014 FF31 push dword [ecx]:将ecx寄存器指向的地址处的值压入栈中。这可能是为了函数调用准备参数。
  • 00000016 4E dec esi:将esi寄存器的值减1,可能是用于循环计数器。
  • 00000017 83E908 sub ecx,byte +0x8:将ecx寄存器的值减去8,这可能是为了移动到数组或结构体的下一个元素。
  • 0000001A 85F6 test esi,esi:再次测试esi的值,设置条件码。
  • 0000001C 75EF jnz 0xd:如果esi不为零(ZF=0),则跳转到地址0xd(即循环回lea ecx,[ecx+esi*8-0x4]这一行)。
  • 0000001E FF5508 call [ebp+0x8]:调用一个函数,其地址存储在ebp+0x8处。这通常是一个局部变量或参数指向的函数指针。
  • 00000021 5E pop esi:从栈中弹出值并存储到esi寄存器中,恢复esi的原始值。
  • 00000022 C9 leave:leave指令是mov esp,ebp; pop ebp的简写,用于恢复栈指针和基指针寄存器到函数调用前的状态。
  • 00000023 C27C00 ret 0x7c:从函数返回,并清理栈上的0x7c(124)字节的参数。这表明函数可能接收了多个参数或使用了较大的栈空间。




最佳答案

查看完整内容

不勾选 参考 情况下 长整数、双精度、日期时间 占8字节,其它类型占4字节 勾选 参考 情况下所有类型的参数统一占4字节 勾选 可空 额外占4字节,因为可空额外push了4字节用于 是否为空() 判断。 所以你这个call就是16*4+15*4=124

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

本帖被以下淘专辑推荐:

签到天数: 19 天

发表于 2024-11-8 09:01:22 | 显示全部楼层   福建省福州市
不勾选 参考 情况下 长整数、双精度、日期时间 占8字节,其它类型占4字节
勾选 参考 情况下所有类型的参数统一占4字节
勾选 可空 额外占4字节,因为可空额外push了4字节用于 是否为空() 判断。
所以你这个call就是16*4+15*4=124

评分

参与人数 1精币 +8 收起 理由
福仔 + 8 没错

查看全部评分

回复

使用道具 举报

结帖率:68% (17/25)

签到天数: 14 天

 楼主| 发表于 2024-11-8 09:15:15 | 显示全部楼层   湖南省怀化市
屏幕截图 2024-11-08 091254.png
比如这里,这是我在精易模块看到的另一个,远程调用的
最后的指令是 ret,这里为什么不是  RET+参数数量*4
回复

使用道具 举报

结帖率:68% (17/25)

签到天数: 14 天

 楼主| 发表于 2024-11-8 09:59:15 | 显示全部楼层   湖南省怀化市
风行无忌 发表于 2024-11-8 09:34
不勾选 参考 情况下 长整数、双精度、日期时间 占8字节,其它类型占4字节
勾选 参考 情况下所有类型的参数 ...

可以帮我解答一下二楼的问题吗,2楼为什么使用ret而不是用 ret 0x*
回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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