没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-06-03 10:22:31.000|阅读 505 次
概述:这几天学习汇编,分析了一下 c++ 中函数调用(cdecl 和 fastcall 方式)过程的汇编码
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
这几天学习汇编,分析了一下 c++ 中函数调用(cdecl 和 fastcall 方式)过程的汇编码,记录如下:
long funtest1(tagTest p1,int p2,LPCTSTR lpszP3)
return 300;
long __stdcall funtest2(tagTest p1,int p2,LPCTSTR lpszP3)
return 300;
long ixx = 0;
0104171E mov dword ptr [ixx],0
tagTest tag1={34,6,87};
01041738 mov dword ptr [tag1],22h ; 成员赋值
0104173F mov dword ptr [ebp-10h],6 ; 成员赋值
01041746 mov dword ptr [ebp-0Ch],57h ; 成员赋值
ixx = funtest1(tag1,i2,"asdffffffdddddd");
0104174D push offset CAnonymousAsmTestApp::`vftable'+0F4h (11E60B0h) ; 入栈参数
; "asdffffffdddddd" 的地址。这里显示似乎有问题(实际地址是对的)
01041752 mov edx,dword ptr [i2]
01041755 push edx ; 入栈参数 i2
01041756 sub esp,0Ch ; 在栈中分配参数 tag1 的空间
01041759 mov eax,esp
0104175B mov ecx,dword ptr [tag1]
0104175E mov dword ptr [eax],ecx ; 入栈 tag1.n1
01041760 mov edx,dword ptr [ebp-10h]
01041763 mov dword ptr [eax+4],edx ; 入栈 tag1.n2
01041766 mov ecx,dword ptr [ebp-0Ch]
01041769 mov dword ptr [eax+8],ecx ; 入栈 tag1.n3
0104176C call funtest1 (1041680h) ; 调用函数。
;注意:这里同时将返回地址(下条指令的地址) 也入栈(这里是4字节);
; 所以,函数中取得参数时,需要从当前 ESP 中加上 4 字节!
01041771 add esp,14h ; 由调用者清参数栈
01041774 mov dword ptr [ixx],eax ; 获取返回值
00351680 push ebp ; 基址指针入栈
00351681 mov ebp,esp ; 将函数入口点的栈指针作为当前基址指针。
;顾名思义,基址指针就是进入函数时的栈顶指针!
00351683 push ecx ; 在栈中分配局部变量空间。
;ecx 中的值无关紧要,只是预留一个 4 字节空间而已
p1.n1 = 3;
00351684 mov dword ptr [p1],3 ; 赋值
LPCTSTR lpszxx = lpszP3;
0035168B mov eax,dword ptr [lpszP3] ; [lpszP3] 地址应该就是 ebp - 4
0035168E mov dword ptr [lpszxx],eax ; 赋值(通过 eax)
p1.n3 = p2;
00351691 mov ecx,dword ptr [p2]
00351694 mov dword ptr [ebp+10h],ecx ; 赋值(通过 ecx)
return 300;
00351697 mov eax,12Ch ; 返回值放在 eax
}
0035169C mov esp,ebp ; 恢复栈:清除局部变量
0035169E pop ebp ; 恢复基址指针
0035169F ret ; 返回(从栈中弹出返回地址,然后 jmp )
int i2=3;
long ixx = 0;
tagTest tag1={34,6,87};
ixx = funtest2(tag1,i2,"asdffffffdddddd");
生成的汇编码: int i2=3;
010A1759 mov dword ptr [i2],3
long ixx = 0;
010A1760 mov dword ptr [ixx],0
tagTest tag1={34,6,87};
010A1767 mov dword ptr [tag1],22h
010A176E mov dword ptr [ebp-0Ch],6
010A1775 mov dword ptr [ebp-8],57h
ixx = funtest2(tag1,i2,"asdffffffdddddd");
010A177C push offset CAnonymousAsmTestApp::`vftable'+104h (12460C0h) ; 入栈参数
; "asdffffffdddddd" 的地址。这里显示似乎有问题(实际地址是对的)
; 和 cdecl 一样,参数从右边开始入栈
010A1781 mov eax,dword ptr [i2]
010A1784 push eax
010A1785 sub esp,0Ch
010A1788 mov ecx,esp
010A178A mov edx,dword ptr [tag1]
010A178D mov dword ptr [ecx],edx
010A178F mov eax,dword ptr [ebp-0Ch]
010A1792 mov dword ptr [ecx+4],eax
010A1795 mov edx,dword ptr [ebp-8]
010A1798 mov dword ptr [ecx+8],edx
010A179B call funtest2 (10A16B0h)
010A17A0 mov dword ptr [ixx],eax ; 取得返回值。
; 注意:这里没有清栈的代码,由函数自己清栈!
long __stdcall funtest2(tagTest p1,int p2,LPCTSTR lpszP3)
{
010A16B0 push ebp
010A16B1 mov ebp,esp
010A16B3 push ecx
p1.n1 = 3;
010A16BD mov dword ptr [p1],3
LPCTSTR lpszxx = lpszP3;
010A16C4 mov eax,dword ptr [lpszP3]
010A16C7 mov dword ptr [lpszxx],eax
p1.n3 = p2;
010A16CA mov ecx,dword ptr [p2]
010A16CD mov dword ptr [ebp+10h],ecx
return 300;
010A16D0 mov eax,12Ch
}
010A16D5 mov esp,ebp
010A16D7 pop ebp
010A16D8 ret 14h ; 返回并清栈。
;(从栈中弹出返回地址,返回;然后ESP增加14H,14H为参数栈的字节数)
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号