函数调用与栈

函数调用与栈

内存栈

  在C语言中函数的调用必须借助于栈。
  关于栈是什么就不再做笔记了,但需要注意的是,这里的栈与数据结构中的栈虽然原理相同但并不是一个东西。在这里,栈就是一段计算机内存,只不过这段内存满足数据后进先出的规则。
  另外还需要注意的是,内存栈是向下增长的,即栈顶在下、栈底在上。之所以这样子,是因为我们将内存的高地址视为在上面、低地址在下面,而栈是由高地址向低地址推进的。如下图所示:
在这里插入图片描述

调用函数前

  在C程序调用函数前,它会现将函数所要用到的参数值以 逆序 的方式压入栈中。当调用函数时,函数所使用的参数值就是这些被压入栈中的值。此时栈中的情况如下图所示:
在这里插入图片描述

这里要注意的是逆序压入,这是C语言调用的约定。比如调用函数fun(a, b, c, d),则压栈的顺序为d、c、b、a 。

这里也解释了为什么C语言调用函数后,作为参数的变量,它们的值并没有发生改变。其原因就在于它们本身并没有参与被调用函数中的运算,真正参与运算的是它们在栈中的拷贝。

  在压入参数值后,将会一条call跳转指令。call指令会将调用完函数后将要返回的地址压入栈中,然后跳转到函数起始处(即将%eip寄存器的值修改为函数的起始地址)。此时栈中情况如图所示:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值