函数调用原理——栈帧

函数调用原理————栈帧
1.栈

栈是向下生长的,也就是由内存高地址-》低地址的。栈有自己的栈顶指针和栈底指针。
ebp : 称为“基址指针”,在未改变之前一直指向栈底
esp : 称为“栈指针” , 随着数据的入栈和出栈移动,也就是说一直指向的是栈顶

2.了解一些简单的汇编指令

call(函数调用) : 先将当前指令的下一条指令地址压栈,然后跳转到被调用的函数处。
ret (函数返回)?: 把call指令压栈的内容出栈,然后执行这块内容所指向的指令

3.函数的调用过程描述

如下图: main函数调用fun函数。(注意,其实在程序运行时,main函数是被start函数所调用的)
①: 查看汇编代码,发现main函数调用fun函数时,用了call命令调用fun函数
②: 先将main函数堆栈的ebp压栈(这个时候,main函数的esp向下移动),保存main函数的任务信息。
③: 把esp的值付给ebp,也就是把ebp指向esp,这个时候就创建了fun函数的栈底
④: 然后在这个栈底上(用sub指令)开辟一块空间作为fun函数的占空间,esp指向fun函数的栈顶
⑤: (通过一些寄存器来实现这块栈空间的初始化,过程我们不讨论)fun函数运行完成后返回,
(通过mov指令)让esp指向ebp,这时fun函数的栈底ebp恢复为main函数的栈顶esp,
然后让ebp出栈,ebp回到main函数的栈底,(通过ret指令)返回main函数,这个时候ebp和esp回到了原来的位置
栈恢复到了fun函数被调用的状态。

下面是我在vs2013上面写的一段代码,查看其汇编之后所画的栈帧图。希望指正!



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的函数调用涉及以下几个步骤: 1. 函数定义:首先,我们需要定义一个函数,使用关键字`def`后跟函数名和参数列表。函数体内包含了一系列的执行语句。 2. 参数传递:在调用函数时,我们向函数传递参数。这些参数可以是位置参数或关键字参数,并以逗号分隔。 3. 函数调用:在代码中,我们通过函数名和参数列表来调用函数。当函数被调用时,Python会根据函数名找到相应的函数定义。 4. 函数执行:一旦函数被调用,控制权就会转移到函数内部。函数体中的语句按照顺序执行。函数可以执行任何操作,例如计算、打印输出、返回结果等。执行完所有语句后,函数将控制权返回给调用它的地方。 5. 返回值:函数可以返回一个值。使用关键字`return`后跟要返回的值。当函数执行到`return`语句时,它会立即停止执行,并将返回值返回给调用它的地方。 6. 函数嵌套调用:在函数体内部,我们也可以调用其他函数。这被称为函数嵌套调用。在嵌套调用中,执行顺序是按照函数调用的顺序依次执行。 函数调用原理的核心是函数的定义和调用。通过定义函数,我们可以将一系列的操作封装为一个可重复使用的代码块。随后,我们可以通过调用函数来执行这些操作。函数的参数和返回值可以帮助我们将数据传递给函数和从函数中获取结果。函数调用使我们的代码更加模块化,提高了代码的复用性和可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值