首页
社区
课程
招聘
[原创]01 C语言-参数传值 ,返回值以及局部变量
发表于: 2021-3-21 22:31 8233

[原创]01 C语言-参数传值 ,返回值以及局部变量

2021-3-21 22:31
8233

前言

    该文章主要是分析了C语言函数的Debug环境下参数是如何传入以及通过函数的运算是如何将运算的结果传出。

    首先,执行程序, 然后定位到地址"0X4417D8"。该位置就是我们"c = a(1,2)" 代码对应的汇编代码。接下来我们看到就是连续两个push指令以及一个Call指令。

    下面,我们单步执行push指令,然后,我们关注栈空间。这个时候,我们发现1和2两个数字已经被压入栈空间。紧接的是执行一个call指令。(call指令是一个跳转指令,并且将call指令的返回地址压入栈空间)

    然后我们执行Call指令。我们先注意一下Call指令的返回地址。

    执行Call 指令之后,发现此时栈空间已经被压入了call 指令的返回地址。

    这个时候,我们在代码区发现跳转到了jmp 指令,这个是一个跳转指令。不用着急,继续单步执行。

    这里的jmp指令跳转之后,程序就会跳转到定义函数的位置,即如下图位置。

    继续单步执行之后,我们跳转到了如下图位置。该位置就是函数"a(int x,int y)"的函数位置。

    接下来,我们继续关注汇编代码。首先我们先看两个指令push ,mov 指令。那么这个指令有什么作用呢 ?我们先单步执行完这两个指令。

    这个时候,我们关注栈空间,发现EBP的值发生了变化。我们发现新的EBP值得位置当中得内容存入得是之前EBP得值。同时,将ESP的值与EBP值相等。该作用是初始化一个新的栈空间,这个栈空间就是供函数a()使用的。

    紧接着,我们执行sub 指令。这个时候我们关注栈空间。很明显该指令的作用的给函数分别缓冲区。

    下面执行三个push 指令。执行完成,我们关注一下栈空间。此时我们发现在“EBP-D0”~"EBP-D8"位置压入了ebx,esi,edi寄存器的值。他的作用的保存环境。

  

    紧接着,我们继续执行“lea edi,dword ptr ss:[ebp-0xCC]”以及“mov eax,0xCCCCCCCC”,“rep stos dword ptr es:[edi]”。该指令执行结束之后。我们观察栈空间。  此时,我们发现之前生成的缓冲区现在已经填满了“CC”即int 3 断点指令。这样做的好处的当程序执行异常可以即时中断程序。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-3-23 13:38 被天象独行编辑 ,原因: 新增栈空间图
收藏
免费 4
支持
分享
最新回复 (6)
雪    币: 1065
活跃值: (145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
DEBUG 版本才会初始化为0xCC release并没有
2021-3-21 22:38
0
雪    币: 1657
活跃值: (6833)
能力值: ( LV12,RANK:215 )
在线值:
发帖
回帖
粉丝
3
journey_g DEBUG 版本才会初始化为0xCC release并没有
谢谢提醒
2021-3-21 22:59
0
雪    币: 1859
活跃值: (2245)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
写得很好,我看过相关的资料,是这样描述的。执行函数的时候,栈通常需要经过如下几步:开辟空间 -> 保护现场 -> 初始化 -> 执行函数体 -> 堆栈平衡 -> 退出。当然,也会由于约定函数的不同,这个流程,也有有一些变化,但是基本上,是这样的。
2021-4-14 10:02
0
雪    币: 1657
活跃值: (6833)
能力值: ( LV12,RANK:215 )
在线值:
发帖
回帖
粉丝
5
奋进的小杨 写得很好,我看过相关的资料,是这样描述的。执行函数的时候,栈通常需要经过如下几步:开辟空间 -> 保护现场 -> 初始化 -> 执行函数体 -> 堆栈平衡 -> 退出。当 ...
我洋洋洒洒大片文字,被你三两句总结,由繁入简。你才是高手啊
2021-4-14 10:58
0
雪    币: 1657
活跃值: (6833)
能力值: ( LV12,RANK:215 )
在线值:
发帖
回帖
粉丝
6
天象独行 我洋洋洒洒大片文字,被你三两句总结,由繁入简。你才是高手啊
堆栈平衡的话同样也会因为约定的不同,由调用者平衡还是被调用者平衡,也是有区别的。不过问题不大。
2021-4-14 10:59
0
雪    币: 928
活跃值: (1878)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
牛逼
2023-1-25 19:37
0
游客
登录 | 注册 方可回帖
返回
//