函数调用指令, 返回机制分析(x86_64)

预备


#include <stdio.h>int addDetail(int a, int b)
{return a + b;
}int add(int a, int b)
{int c;c = addDetail(a, b);return c;
}int main(int argc, char *argv[])
{int sum;sum = add(3, 5);printf("sum = %d\n", sum);return 0;
}

汇编

main

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

add

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

addDetail

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基础

  1. rbp 是基底指针,指向堆栈的起点
  2. rsp是栈顶指针,指向堆栈的顶点。
  3. AT&T 语法中的指令格式为mnemonic source, destination
  4. .助记符是指令的人类可读名称。
  5. 源和目标是操作数,可以是立即数、寄存器、内存地址或标签。
  6. 立即数是常量,并以 a 为前缀$。例如,$0x5以十六进制表示数字 5。
  7. 寄存器名称以 . 为前缀

流程调用

main_rsp = 0x7fff ffff de40

main_rbp = 0x7fff ffff de60

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入函数add时的操作, 将添加新的栈帧

  1. 将main的栈底rbp压入栈中
  2. 再把rbp重新指向rsp寄存器, 进入新的栈帧
  3. 再rsp减去0x18个字节, 指向栈顶, 中间位栈空间
  4. 再把函数参数从寄存器中移动到栈空间
    参数a = *($rbp - 0x14)
    参数b = *($rbp - 0x18)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

add_rsp = 0x7fff ffff de18

add_rbp = 0x7fff ffff de30

进入add函数内部, 再执行另一个函数addDetail前的操作

add参数a 和 b 在这里多复制了一遍, 可以引出右值引用

  1. 先把add帧栈中的值赋值到edx和eax寄存器中
  2. 再把exd和eax寄存器中的值赋值到esi和edi中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入addDetail函数时的操作

// 为什么不申请空间?

  1. 将add的栈底rbp压入栈中
  2. 再把rbp重新指向rsp寄存器, 进入新的栈帧
  3. 再把函数参数从寄存器中移动到栈空间
    参数a = *($rbp - 0x4)
    参数b = *($rbp - 0x8)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

addDetal_rsp = 0x7fff ffff de08

addDetal_rbp = 0x7fff ffff de08

addDetail函数内部

  1. 把自动变量移动到计算寄存器中, eax(操作运算符, 结果)和 edx
  2. 相加, eax得到结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

addDetail函数返回操作

没pop前

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

pop后, 从栈中弹出之前的detail_rbp ,把rbp 覆盖

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

retq,跳转回返回地址

返回add函数返回处

把返回的函数值赋值到自动变量中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

add函数返回操作

防止自动变量消失, 要存到寄存器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

leaveq 返回到 rbp被main_rbp覆盖, retq 跳转

main函数返回, 并退出

把寄存器中的值放到main的自动变量中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

printf 输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

退出

最后调用了exit

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZZ038 物联网应用与服务赛题第J套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;J卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…

FreeRTOS_任务通知

目录 1. 任务通知简介 2. 发送任务通知 2.1 函数 xTaskNotify() 2.2 函数 xTaskNotifyFromISR() 2.3 函数 xTaskNotifyGive() 2.4 函数 vTaskNotifyGiveFromISR() 2.5 函数 xTaskNotifyAndQuery() 2.6 函数 xTaskNotifyAndQueryFromISR() 3. 任务通知通用发送函数 3.…

【NI-DAQmx入门】NI-DAQmx之C、C++、VB、VB.net与C#支持

DAQmx应用程序编程接口(API) DAQmx附带数据采集编程所需的API。DAQmx API只是一组库&#xff0c;其中包含关于如何执行所有数据采集操作的函数。这些API支持LabWindows/CVI、C、C、Visual Basic 6.0、VB.NET和C#。 DAQmx API随DAQmx驱动程序一起安装&#xff0c;包含以下参考…

Lambda 架构 vs Kappa 架构

大数据处理架构详解&#xff1a;Lambda架构、Kappa架构、流批一体、Dataflow模型、实时数仓 https://www.cnblogs.com/robots2/p/17769376.html 大数据架构设计&#xff08;四十五&#xff09; - 知乎 浅析Lambda架构 - 简书 Lambda 架构 vs Kappa 架构 Lambda架构和Kappa架…

基于 golang 从零到一实现时间轮算法 (二)

Go实现单机版时间轮 上一章介绍了时间轮的相关概念&#xff0c;接下来我们会使用 golang 标准库的定时器工具 time ticker 结合环状数组的设计思路&#xff0c;实现一个单机版的单级时间轮。 首先我们先运行一下下面的源码&#xff0c;看一下如何使用。 https://github.com/x…

【Python语言速回顾】——爬虫基础知识

目录 一、爬虫概述 1、准备工作 2、爬虫类型 3、爬虫原理 二、爬虫三大库 1、Requests库 2、BeautifulSoup库 3、Lxml库 一、爬虫概述 爬虫又称网络机器人&#xff0c;可以代替人工从互联网中采集、整理数据。常见的网络爬虫主要有百度公司的Baiduspider、360公司的36…

自动驾驶算法(七):基于遗传算法的路径规划(下)

目录 1 遗传选择 2 遗传交叉 3 遗传变异 4 结语 1 遗传选择 我们书接上回&#xff0c;我们完成了种群的初始化&#xff0c;将所有的种群放入了new_pop1中&#xff0c;这个new_pop1是一个&#xff08;种群大小 * 路径&#xff09;的一个矩阵&#xff0c;我们来看如何进行遗传…

Java面向对象(进阶)-- super关键字的使用与子类对象实例化全过程

文章目录 一、super关键字的使用&#xff08;1&#xff09;为什么需要super&#xff1f;&#xff08;2&#xff09;super的理解&#xff08;3&#xff09;super可以调用的结构1、super调用方法举例1举例2举例3小结 2、super调用属性举例1举例2举例3小结 3、super调用构造器引入…

el-tree中展示项换行展示

文章目录 效果如下所示&#xff1a;没有换行展示的效果修改样式换行之后的展示效果 想要了解el-tree使用的详情往下看代码和数据如下所示Vue代码中可能使用到的数据如下Vue的代码如下&#xff1a;没有换行展示的效果换行之后的展示效果样式调试 效果如下所示&#xff1a; 没有…

数据库的备份和恢复

备份&#xff1a;完全备份&#xff0c;增量备份 完全备份&#xff1a;将整个数据库完整的进行备份 增量备份&#xff1a;在完全备份基础的之上&#xff0c;对后续新增的内容进行备份 备份的需求 1生产环境中&#xff0c;数据的安全性至关重要&#xff0c;任何数据都可能产生非…

【计算机架构】程序指令计数 | 功耗计算 | 电力功耗 | 安德尔定律(Amdahl‘s Law)

0x00 程序的指令计数 程序的指令计数&#xff08;Instruction Count&#xff09;由程序本身、ISA&#xff08;指令集架构&#xff09;和编译器决定。这表示一个程序中包含的指令数量受到程序编写方式、计算机体系结构和编译器的影响。 每条指令的平均周期数&#xff08;Averag…

人体姿态估计和手部姿态估计任务中神经网络的选择

一、人体姿态估计任务适合使用卷积神经网络&#xff08;CNN&#xff09;来解决。 人体姿态估计任务的目标是从给定的图像或视频中推断出人体的关节位置和姿势。这是一个具有挑战性的计算机视觉任务&#xff0c;而CNN在处理图像数据方面表现出色。 使用CNN进行人体姿态估计的一种…

Uniapp 中,能够同时兼容H5、web、app、微信小程序的引入高德地图的语法格式

在 Uniapp 中&#xff0c;可以通过使用 uni-app 统一的 API 来同时兼容 H5、web、App 和微信小程序&#xff0c;而引入高德地图则有以下两种语法格式供选择&#xff1a; 使用 Vue.js 的语法格式&#xff1a; <template><view><map :longitude"longitude&…

在云上jupylab(codelab)常用的shell命令

1、切换当前文件目录位置&#xff1a; %cd /project/train/ 2、删除目标文件夹和文件夹下面的内容&#xff0c;注意这个r是不能少的&#xff1a; !rm -r /project/train/src_repo/dataset 3、创建数据集相关文件夹 !mkdir /project/train/src_repo/dataset 4、复制指定…

想学计算机编程从什么学起?零基础如何自学计算机编程?中文编程开发语言工具箱之渐变标签组构件

想学计算机编程从什么学起&#xff1f;零基础如何自学计算机编程&#xff1f; 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;…

LeetCode 0318. 最大单词长度乘积

【LetMeFly】318.最大单词长度乘积 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-product-of-word-lengths/ 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。如…

FastDFS整合nginx

从您提供的步骤来看&#xff0c;FastDFS整合nginx的过程包括准备工作、安装FastDFS的nginx模块、配置nginx以及启动nginx服务。接下来我将基于您提供的信息对步骤进行修改和补充&#xff0c;以确保更加清晰易懂。 1. 安装前配置fastdfs-nginx-module 1.1 上传并解压fastdfs-n…

数据结构实验二停车场

内容仅供个人复习 *设停车场内只有一个的停放 n 辆汽车的狭长通道&#xff0c;且只有一个大门可供汽车进出。汽车 在停车场内按车辆到达时间的先后顺序&#xff0c;依次由北向南排列&#xff08;大门在最南端&#xff0c;最先到达的第 一辆车停放在车场的最北端&#xff09;&am…

linux硬盘挂载(linux 修改某个磁盘挂载到新目录\lvm扩容)

文章目录 一、什么是硬盘挂载二、linux 修改某个磁盘挂载到新目录三、Esxi下扩容硬盘1. 判断一个已有的文件系统是否使用了LVM(逻辑卷管理)2. 原本文件系统没有使用lvm&#xff0c;还可以lvm扩容吗&#xff1f;3. 原有文件系统使用lvm场景下扩容(lvm扩容)了解LVMEsxi LVM扩容步…

NOIP2000提高组第二轮T4:方格取数

题目链接 [NOIP2000 提高组] 方格取数 题目描述 设有 N N N \times N NN 的方格图 ( N ≤ 9 ) (N \le 9) (N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 0 0 0。如下图所示&#xff08;见样例&#xff09;: 某人从图的左上…