鱼C论坛

 找回密码
 立即注册
查看: 6692|回复: 18

[技术交流] C/C++函数传参,汇编分析

[复制链接]
发表于 2012-3-26 11:44:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬冬 于 2012-3-26 21:33 编辑

   函数传参介绍:_cdecl这是C/C++采用的默认的传参方式,即参数按从右到左依次入栈。且有调用者负责清理堆栈.
  1、EBP寄存器,栈基址寄存器。

这本是一个通用寄存器,但在长期的编程习惯中,人们给了它一个默认的约定,通常用来堆栈传参后,执行call后的栈指针值。
2、我利用内联汇编分析了:
#include <iostream>
using namespace std;
int Add(int a,int b)
{
int tmp_A,tmp_B;
int tmp_EBP;
__asm
{
push eax
mov eax,[ebp+8]
mov tmp_A,eax
mov eax,[ebp+12]
mov tmp_B,eax
mov tmp_EBP,ebp
pop eax
}
cout<<"EBP+0:\t\t"<<hex<<uppercase<<tmp_EBP<<endl;
cout<<"EBP+4\t\t"<<hex<<*(int*)(tmp_EBP+4)<<endl;
cout<<"EBP+8\t\t"<<hex<<*(int*)(tmp_EBP+8)<<endl;
cout<<"EBP+12\t\t"<<hex<<*(int*)(tmp_EBP+12)<<endl<<endl;
cout<<"第一个参数\t"<<hex<<tmp_A<<endl;
cout<<"第二个参数\t"<<hex<<tmp_B<<endl;
return tmp_A+tmp_B;
}

int main()
{
Add(123,456);
return 0;
}

//输出结果:
EBP:             2DFD40        //那么这几个值是啥呢???
EBP+0:          2DFE1C            //那么这几个值是啥呢???
EBP+4            131193A    //那么这几个值是啥呢???
EBP+8           7B                    //毫无疑问,这是我要传递的参数
EBP+12          1C8                 //毫无疑问,这是我要传递的参数
第一个参数      7B
第二个参数      1C8
请按任意键继续. . .



我们在VC++中进入调试模式,查看反汇编代码(ALT+8)
先来看下Main函数内:

int main()
{
01311910  push        ebp  
01311911  mov         ebp,esp
01311913  sub         esp,0C0h
01311919  push        ebx  
0131191A  push        esi  
0131191B  push        edi  
0131191C  lea         edi,[ebp-0C0h]
01311922  mov         ecx,30h
01311927  mov         eax,0CCCCCCCCh
0131192C  rep stos    dword ptr es:[edi]
Add(123,456);
0131192E  push        1C8h
01311933  push        7Bh  
01311935  call        Add (13110B4h)
0131193A  add         esp,8    //注意下他的指令地址与 输出  EBP+4            131193A
system("Pause");
0131193D  mov         esi,esp
0131193F  push        offset string "Pause" (13178B8h)
01311944  call        dword ptr [__imp__system (131A424h)]
0131194A  add         esp,4
0131194D  cmp         esi,esp
0131194F  call        @ILT+445(__RTC_CheckEsp) (13111C2h)
return 0;
01311954  xor         eax,eax
}

//看看他们的指令地址:
01311935  call        Add (13110B4h)
0131193A  add         esp,8    //注意下他的指令地址与 输出  EBP+4            131193A

知道ESP+4是啥了不?

4、EBP和EBP+4的值什么。
EBP:             2DFD40        //那么这几个值是啥呢???
EBP+0:          2DFE1C            //那么这几个值是啥呢???

介绍下OEP即入口地址:
C语言每个函数的开头均已
push ebp                     // EBP寄存器保护
mov ebp,esp
而函数结束
mov esp,ebp               //回复ESP寄存器,以保持对战平衡
pop ebp                     //函数入口时的esp寄存器既然回复了,我们利用esp寄存器,就可以回复ebp寄存器了。

至于我在函数中,输出的EBP和EBP+0 值我想聪明的你应该知道是啥了。
呵呵至此,分析完毕......
我至于初学者,许多地方也是凭着才想去实验的.....      

遗留的几个问题解答:
[tr][/tr]
push ebp                     // EBP寄存器保护
mov ebp,esp
那么EBP的值自然是 进入call之后的ESP值。
第二个问题:【EBP+0】
是进入call执
push  ebp
那么 EBP+0就是 上次EBP的值,入栈一边保护寄存器用








评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
湮汐 + 3 + 3 很好的东西啊! 汇编联合C

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-26 14:03:57 | 显示全部楼层
本帖最后由 libocdf 于 2012-3-26 14:04 编辑

难得的好帖。楼主,这个应该置顶加精。。不过问题的关键点是EBP和EBP+0的值,但仔细看源程序中,只有对EBP+0的输出,而没有EBP的输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-26 14:06:58 | 显示全部楼层
本来想加分的。。结果我没有贡献值。。擦擦擦!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-26 14:19:40 | 显示全部楼层
文章还有其他一些问题。比如楼主提出的问题“知道ESP+4是啥了不?”应该是想问“EBP+4”或“ESP-0ch”吧。。就是call压入的返回地址。还有“4、EBP和EBP+4的值什么。”应该是“4、EBP和EBP+0的值什么。”吧。。这里我确实没看懂。。。望楼主解答一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-26 21:32:20 | 显示全部楼层

push ebp                     // EBP寄存器保护
mov ebp,esp
那么EBP的值自然是 进入call之后的ESP值。
第二个问题:【EBP+0】
是进入call执
push  ebp
那么 EBP+0就是 上次EBP的值,入栈一边保护寄存器用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-28 06:36:56 | 显示全部楼层
完全不明白,小菜呀,努力学习,超越楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-28 23:22:36 | 显示全部楼层
不懂得汇编,看不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-6 21:31:41 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 20:45:04 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-11 22:33:05 | 显示全部楼层
好贴,只不过看着头晕啊啊
肿么办!!!~?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-5 10:54:43 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-25 23:30:17 | 显示全部楼层
C语言,C++,真没易语言好学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-26 07:57:31 | 显示全部楼层
楼主加油,鱼C加油!我们都看好你哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-1 17:49:15 | 显示全部楼层
好,谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-2 12:09:05 | 显示全部楼层
给力!!!!!!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-2 12:38:36 | 显示全部楼层
楼主,函数的传递不保证从右至左,每个c++编绎器不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-2 11:03:57 | 显示全部楼层
不错的啊:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-9 22:03:01 | 显示全部楼层
表示不是很懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-3 17:30:07 | 显示全部楼层
看不懂,难受啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-31 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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