-
-
[原创]01 C语言-参数传值 ,返回值以及局部变量
-
发表于:
2021-3-21 22:31
8208
-
[原创]01 C语言-参数传值 ,返回值以及局部变量
前言
该文章主要是分析了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 断点指令。这样做的好处的当程序执行异常可以即时中断程序。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-3-23 13:38
被天象独行编辑
,原因: 新增栈空间图