当前位置: 首页 > news >正文

网站建设公司推广百度投放广告一天多少钱

网站建设公司推广,百度投放广告一天多少钱,互联网公司排名2021南方财富网,救护车网站找谁做栈帧布局与函数跳转栈帧布局函数跳转栈帧布局 我们按照编程语言的语法定义的函数,会被编译器编译为一堆机器指令,写入可执行文件,程序执行时,可执行文件被加载到内存,这些机器指令对应到虚拟地址空间中,位…

栈帧布局与函数跳转

  • 栈帧布局
  • 函数跳转

栈帧布局

我们按照编程语言的语法定义的函数,会被编译器编译为一堆机器指令,写入可执行文件,程序执行时,可执行文件被加载到内存,这些机器指令对应到虚拟地址空间中,位于代码段。
在这里插入图片描述
如果在一个函数中调用另一个函数,编译器就会对应生成一条call指令,程序执行到这条指令时,就会跳转到被调用函数处开始执行,而每个函数的最后都有一条ret指令,负责在函数结束后跳回到调用处,继续执行。

函数执行时需要有足够的内存空间,供函数存放局部变量,参数等数据,这段空间对应到虚拟地址空间的栈,栈是向下增长,分配给函数的栈空间,被称为栈帧,栈底被称为栈基bp,栈顶又叫栈指针sp
在这里插入图片描述
go语言函数栈帧布局是这样的,先是调用者函数栈基地址,接下来是局部变量,然后是调用函数的返回值和参数
在这里插入图片描述

函数跳转

call指令只做两件事

  1. 第一将下一条指定的地址入栈,这就是返回地址,被调用函数执行结束后会跳回到这里(从现象看,返回地址是被CALL指令压栈的,既不是调用者分配的,也不是被调用者分配的。逻辑上看,调用者不会访问栈上的返回地址以及位于返回地址之下的地方。但被调用者的视角看,从上到下依次是参数、返回地址、局部变量,所以应该算是被调用者的栈帧,也就是可以理解为被调用者栈帧第一个存的是return addr,第二个存的是调用者bp。)
  2. 第二,跳转到被调用函数的入口处开始执行
    所有的函数的栈帧布局都遵循统一的约定,所以,被调用者是通过栈指针加上相应的偏移来定位到每个参数和返回值的
    在这里插入图片描述
    程序执行时,CPU用特定的寄存器来存储运行时bp与sp,同时也有指令指针寄存器用于存储下一条要执行的指令地址。
    go语言的栈不是逐步扩张的,而是一次性分配,也就是在分配栈帧时,直接将栈指针移动到所需最大栈空间的位置,然后通过栈指针+偏移值这种相对寻址方式使用函数栈帧
    在这里插入图片描述
    之所以一次性分配,主要是为了避免栈访问越界。由于函数栈帧的大小,可以在编译时期确定,对于栈消耗较大的函数,go语言的编译器会在函数头部插入检测代码,如果发现需要进行“栈增长”,就会另外分配一段足够大的栈空间,并把原来栈上的数据拷贝过来,原来这段栈空间就被释放了。
    在这里插入图片描述
    接下来看看call指令和ret指令是怎样实现函数跳转与返回的

一个函数A在a1处调用b1处的函数B,跳转前寄存器和栈的情况是这样的
在这里插入图片描述

然后到call指令这里,它的作用有两点,第一,把下一条指令执行地址a2入栈保存起来,第二,跳转到指令执行地址b1处,call指令就结束了。
在这里插入图片描述
函数B开始执行,先把sp向下移动24字节,为自己分配足够大的栈帧,所以栈指针移到s7,接下来是b2这条指令,要把调用者栈基(caller bp)存到sp+16的地方,接下来b3把sp+16存入栈基寄存器,接下来就是执行函数B剩下的指令了
在这里插入图片描述
在ret指令之前,编译器还会插入两条指令,第一条指令恢复调用者A的栈基地址,它之前被存储在sp+16字节这里,这就是为什么栈帧布局第一条就是caller’s bp的原因,第二条指令释放自己的栈帧空间,分配时向下移动多少,释放时就向上移动多少

在这里插入图片描述
然后就到ret指令了,它的作用也有两点,第一弹出call指令压栈的返回地址,第二,指令指针寄存器跳转到这个返回地址,ok现在可以从a2这里继续执行了
在这里插入图片描述
简单来说,函数通过call指令实现跳转,而每个函数开始时会分配栈帧,结束前又会释放自己的栈帧,ret指令又会把call恢复到call之前的样子,通过这些指令的配合能够实现函数的层层嵌套。如果函数A嗲用B,B调用C,C调用D,就会形成这样的栈
在这里插入图片描述
如果每次调用的都是A,就是递归调用栈了

http://www.lbrq.cn/news/2798677.html

相关文章:

  • 三明企业网站建设山西seo排名
  • 最好的免费发布网站百度官网首页登陆
  • 丹东建设工程信息网站html简单网页设计作品
  • 网站建设在线推广推广代理公司
  • 投票网站设计百度官网app下载
  • 游戏网页代码西安百度seo
  • 宁波哪家公司做网站好百度云盘登录入口
  • 响应式网站是怎么做的seo的基本内容
  • 建站节沈阳黄页88企业名录
  • 西安做门户网站最好的公司运营推广
  • 珠海市住房城乡建设官网北京seo公司wyhseo
  • 成都app制作软件seo教程免费
  • 建设摩托车是名牌吗关键词优化到首页怎么做到的
  • 靠谱网站优化哪家好交换友链
  • 网页设计需求模板seo营销服务
  • 住房新建网站在线crm系统
  • 医院网站建设方案书360指数在线查询
  • wordpress做学校网站合肥网站排名推广
  • 我先做个网站怎么做的百度快速排名优化技术
  • 怎样制作微信网站优化设计答案五年级上册
  • 建站的步骤有哪些在线培训网站
  • 网站建设需要注意哪些百度优化教程
  • 微信显示wordpress南京seo外包
  • 北京城市建设档案馆网站网站优化seo怎么做
  • dw怎么做网站首页广州seo排名优化服务
  • 赣州建站一手app推广接单平台
  • 东西湖区网站建设公司网络营销策划需要包括哪些内容
  • 一站式企业服务提高工作效率
  • 公司网站建设方案模板下载郑州网络推广方案
  • 成都怎样制作公司网站四川网络推广seo
  • 从源码中学习Java面向对象的多态
  • Dockerfile
  • leetcode-python-242有效的字母异位词
  • 2025-08-21 Python进阶1——控制流语句
  • DRF序列化器
  • 01.初识mysql数据库,了解sql语句