函数运行栈有什么变化

函数执行的时候

控制从函数A转移到函数B, 我们需要由两个信息

  • 我从哪里来(返回)
  • 我到那里去(跳转)

当函数A调用函数B时, 我们只要知道

  • 函数A对于的机器指令执行到了哪里(我从哪里来, 返回)
  • 函数B第一条机器指令所在的地址(要到哪里去, 跳转)

这两条信息可以让A来执行B, 当函数B执行完毕后跳转回函数A, 这些信息是如何获取的呢?

函数栈帧中最主要的是, 找到下一个执行的地点, 并且返回,

在这里插入图片描述

其中三个重要的命令是

call 0x40050

0x40056a

ret

call 0x40050

这条机器指令的意思是, 调用我们在代码中写过的函数, call 后面又一条机器指令地址, 这个地址就是函数B的第一条机器指令, 从这条机器指令后CPU将跳转到函数B

跳转过去了, 如何返回呢?

call 指令处理给出跳转地址之外还有这样的一个作用, 也就是把call 指令的下一条指令的地址, 就是0x40056a push 到函数A的栈帧中

ret

这个机器指令的作用是告诉CPU跳转到函数A保存在栈帧上的返回地址, 这样当函数B执行完毕后就可以跳转到函数A继续执行了.

寄存器是共享资源可以被所有函数使用, 既然可以将函数A的局部变量写入寄存器, 那么当函数A调用函数B的时候, 函数B的局部变量也可以写道寄存器中, 这样的话当函数B执行完毕后i到A时寄存器的值已经被函数B修改过来.

因此一定要先将寄存器中开始的值保存起来, 当寄存器使用完毕后再回复原值就可以了.

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值