函数过程的调用

简介: 函数过程的调用

寄存器

  • %rax 通常用于存储函数的返回值,同时也用于乘法和除法指令。在乘法imul指令中,两个64位的乘积超过64位时,高位存储在%rdx中。在除法指令idiv中,被除数是超过64位时,高位存储在%rdx中。
  • %rsp是堆栈指针寄存器,指向的是栈顶。堆栈操作poppush就是通过改变%rsp的值实现。
  • %rbp是栈帧指针,用于标识当前栈帧的起始位置。
  • %rdi,%rsi,%rdx, %rcx, %r8, %r9用来存储函数调用的前6个参数,超出的部分放在堆栈中。

子函数调用过程

在子函数调用时,执行的操作有:

  • 父函数将调用参数从后向前压栈,即arg1在低地址,argn在高地址
  • 将返回地址压栈保存
  • 跳转到子函数起始地址执行
  • 子函数将父函数栈帧起始地址%rbp 压栈
  • %rbp 的值设置为当前 %rsp 的值,即将 %rbp 指向子函数栈帧的起始地址。
pushq rbp         // 将调用函数的栈帧起始地址压入栈
  moveq rsp rbp     // 使得rbp 指向当前被调用函数的栈帧起始地址

call指令,同时完成了将返回地址入栈,以及跳转到子函数,但是调用函数的rbp需要子函数来保存,属于callee save

函数的返回

需要完成:

  • 恢复栈的结果到函数调用之前的状态
  • 跳转到调用函数的返回地址处继续执行

由于在调用子函数时已经保存了返回地址和调用函数的栈帧起始地址,那么只需要恢复即可:

moveq %rbp, %rsp    // 使得 %rsp 和 %rbp 指向一处:子函数的栈帧起始地址 
    popq  %rbp          // 调用函数的栈帧起始地址地址,并且%rsp上移一个位置,指向返回地址

此时,再调用ret指令,其作用就是从当前%rsp指向的位置,即栈顶,弹出数据,并且跳转到此数据表示的地址处。此时调用ret执行

  • 会弹出栈中的数据,返回主函数,
  • 使得%rsp再上移动一个位置,使得%rsp指向调用函数的栈帧的结尾处。
相关文章
|
图形学
Unity 不同Scene场景转换(简)
本文提供了Unity中实现场景转换的基本方法,包括编写传送脚本、创建传送门和玩家对象,并通过触发器实现玩家触碰传送门时切换到另一个场景的功能。
Unity 不同Scene场景转换(简)
|
机器学习/深度学习 人工智能 边缘计算
AI技术在医学影像诊断中的应用
传统的医学影像诊断需要耗费大量时间和人力,而随着人工智能技术的发展,AI在医学影像诊断中的应用也日益广泛。本文将探讨AI技术在医学影像诊断中的应用现状和未来发展,以及其对医疗行业的深远影响。
522 28
【SPSS】生存-寿命表分析详细操作教程(附案例实战)
【SPSS】生存-寿命表分析详细操作教程(附案例实战)
868 0
|
存储 Java 编译器
Go函数解密:底层工作原理
Go函数解密:底层工作原理
239 0
|
3月前
|
存储 弹性计算 运维
阿里云经济型e与通用算力型u1实例有何不同?性能、场景、价格对比与选型参考
在我们选择阿里云服务器实例规格时,经济型e实例和通用算力型u1实例因高性价比与广泛的适用性,深受个人开发者以及中小企业的喜爱。这两款实例不仅在价格上极具竞争力,而且在性能、稳定性以及适用场景方面也各有长处。它们之间究竟存在怎样的区别?在性能表现和适用场景上又有哪些不同?我们又该如何做出选择呢?本文会详细解读这两款实例的性能特点、适用场景、价格优势,以供大家参考。
|
存储 Android开发
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
378 0
|
监控 安全 网络安全
智能合约的安全审计与风险评估:技术解析与应对策略
【8月更文挑战第4天】智能合约的安全审计与风险评估是保障区块链应用安全的重要环节。通过严格的代码审查、使用安全编程规范、实施权限控制以及监控和应急响应等措施,可以有效降低智能合约的安全风险。未来,随着区块链技术的不断发展和智能合约的广泛应用,对智能合约的安全审计与风险评估也将变得更加重要和复杂。因此,我们需要持续关注智能合约的安全问题,并不断探索新的安全技术和方法。
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 一文看懂人工智能、机器学习、深度学习是什么、有什么区别!
**摘要:** 了解AI、ML和DL的旅程。AI是模拟人类智能的科学,ML是其分支,让机器从数据中学习。DL是ML的深化,利用多层神经网络处理复杂数据。AI应用广泛,包括医疗诊断、金融服务、自动驾驶等。ML助力个性化推荐和疾病预测。DL推动计算机视觉和自然语言处理的进步。从基础到实践,这些技术正改变我们的生活。想要深入学习,可参考《人工智能:一种现代的方法》和《深度学习》。一起探索智能的乐趣!
379 1
算法金 | 一文看懂人工智能、机器学习、深度学习是什么、有什么区别!
|
编解码
RTP传输AAC
RTP传输AAC
296 1
|
缓存 Java 关系型数据库
maven篇1: 安装、设置和环境变量配置
maven篇1: 安装、设置和环境变量配置
523 2