首页 > 其他分享 >2.4 过程

2.4 过程

时间:2023-05-21 17:44:47浏览次数:29  
标签:返回 调用 调用者 地址 寄存器 过程 2.4

过程是软件中的一种抽象,提供一种代码封装的方式,类似于函数。

要提供对过程的机器级支持,必须包含以下机制:

传递控制:在进入过程Q的时候,程序计数器必须被设置为Q的代码的起始地址,然后在返回时,要把程序计数器设置为P中调用Q后面那条指令的地址。

传递数据:P必须能够向Q提供一个或多个参数,Q必须能够向P返回一个值。分配和释放内存。在开始时,Q可能需要为局部变量分配空间,而在返回前,又必须释放这些存储空间。

分配和释放内存:在开始时,Q可能需要为局部变量分配空间,而在返回前,又必须释放这些存储空间。

转移控制

将控制从函数P转移到函数Q只需要简单地把程序计数器(PC)设置为Q的代码的起始位置。不过,当稍后从Q返回的时候,处理器必须记录好它需要继续P的执行的代码位置。在x86-64机器中,这个信息是用指令callQ调用过程Q来记录的。该指令会把地址A压入栈中,并将PC设置为Q的起始地址。压入的地址A 被称为返回地址,是紧跟在cal1指令后面的那条指令的地址。对应的指令ret会从栈中弹出地址A,并把PC设置为A。

 数据传送

当调用一个过程时,除了要把控制传递给它并在过程返回时再传递回来之外,过程调用还可能包括把数据作为参数传递,从而过程返回时还有可能包含一个值。可以通过寄存器传递最多6个整型参数,超出六个的部分就要通过栈来传递。

寄存器中的局部存储空间

寄存器组是唯一被所有过程共享的资源。虽然在给定时刻只有一个过程是活动的,我们仍然必须确保当一个过程(调用者)调用另一个过程(被调用者)时,被调用者不会覆盖调用者稍后会使用的寄存器值。为此,x86-64采用了一组统一的寄存器使用惯例,所有的过程(包括程序库)都必须遵循。

根据惯例,寄存器rbx、rbp和r12~r15被划分为被调用者保存寄存器。当过程P调用过程Q时,Q必须保存这些寄存器的值,保证它们的值在Q返回到P时与Q被调用时是一样的。过程Q保存一个寄存器的值不变,要么就是根本不去改变它,要么就是把原始值压入栈中,改变寄存器的值,然后在返回前从栈中弹出旧值。压入寄存器的值会在栈帧中创建标号为“被保存的寄存器”的一部分,如图3-25中所示。有了这条惯例,P的代码就能安全地把值存在被调用者保存寄存器中(当然,要先把之前的值保存到栈上),调用Q,然后继续使用寄存器中的值,不用担心值被破坏。

所有其他的寄存器,除了栈指针rsp,都分类为调用者保存寄存器。这就意味着任何函数都能修改它们。可以这样来理解“调用者保存”这个名字:过程P在某个此类寄存器中有局部数据,然后调用过程Q。因为Q可以随意修改这个寄存器,所以在调用之前首先保存好这个数据是P(调用者)的责任。

 

标签:返回,调用,调用者,地址,寄存器,过程,2.4
From: https://www.cnblogs.com/LCAB/p/17418715.html

相关文章

  • 第五章 单元过程数据收集
    5.1单元过程的划分和描述5.2资料收集与数据处理 5.3完整性与技术分类 5.4单元过程数据库开发案例 ......
  • OverTheWire攻关过程-Leviathan模块1
    我们打开lv0,查看信息然后我们打开lv0-lv1,查看信息一样的信息但是我们发现,我们没有找到相关的文件开始查看这些隐藏的文件发现信息太多使用grep命令匹配结果找到<DT><AHREF="http://leviathan.labs.overthewire.org/passwordus.html|Thiswillbefixedlater,thepasswordfor......
  • OverTheWire攻关过程-Leviathan模块0
    我们学习下leviathan模块,查看下信息机器翻译你敢面对海洋之王吗?利维坦是一个从死亡中拯救出来的战争游戏。intruded.net,曾于leviathan.intruded.net。非常感谢adc,morla和reth在复活这个游戏中的帮助!下面是利维坦的原始描述,复制自intruded.net:摘要:难度:1/10级别:8平台:Linux/x86作者......
  • 应用系统项目开发过程总结
    一调研阶段a.需求调研:在项目开始之前,需要对目标用户进行调查,了解他们的需求和期望。这包括与潜在用户进行访谈、收集反馈和数据分析等。b.环境调研:目前系统功能,版本,技术类型,接口情况,网络环境,系统环境c.技术调研:预期本项目涉及到的新技术,安排人开始熟悉引入d.开发环境准备......
  • 记录一次windows mysql5.7安装失败的过程
    首先下载mysql安装包windows版本 https://dev.mysql.com/downloads/installer/接着在执行安装mysqlmsi安装包最后一步的时候,显示FailedtostartserviceMySQL57.只有在任务处于完成状态(RanToCompletion、Fau这时候检查要么windows下面mysql的卸载残留没清理干净,要......
  • 记一次 Oracle 下的 SQL 优化过程
    1.介绍事情是这样的,UAT环境的测试小伙伴向我扔来一个小bug,说是一个放大镜的查询很慢,转几分钟才出数据,我立马上开发环境试了一下,很快啊我说......
  • springboot 2.4 版本后的多环境配置
    beanpackagecom.example.demo.tt;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;@ComponentpublicclassTT{@Value("${test.ww}")pub......
  • Vulnhub之DriftingBlues 5靶机详细测试过程(得到root shell)
    DriftingBlues5靶机信息名称:DriftingBlues:5地址:https://download.vulnhub.com/driftingblues/driftingblues5_vh.ova识别IP地址(kali㉿kali)-[~/Desktop/Vulnhub/Driftingblues5]└─$sudonetdiscover-ieth1-r192.168.56.0/24Currentlyscanning:192.168.56......
  • flvjs使用过程中报The play() request was interrupted by a call to pause()的原因和
    原因:从表层来看,它的原因是因为在播放出来视频之前就已经被调用了pause方法停止了。但是造成这个过程的真正原因是什么呢?资源加载不成功可能是你的接口写错了,导致没有资源,虽然这是一个很小的可能,但是千万不要忽视每一个小的点时机不对这个时候就是说可能你接口是对的,只是获取......
  • text-generation-webui安装部署的过程-window版本,最后成功运行OPT大模型
    环境:操作系统:windows11RAM:16.0GB处理器:AMDRyzen3700X显卡:NVIDIAGeForceGTX10603GB 1、从上面github下载window版本的一键安装部署的zip。地址:https://github.com/oobabooga/text-generation-webui/2、根据github上步骤,一键安装。  3、等待安装完之后,配置pyt......