函数调用指令, 返回机制分析(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.…

基于 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…

在云上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;…

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;: 某人从图的左上…

ES 报错问题汇总

报错1&#xff1a; curl -XGET http://192.168.56.115:9200/_license解决方式 在 es/config/elasticsearch.yml文件,把开启密码验证把此处也修改成false xpack.security.enabled: false 报错2&#xff1a; 解决方式&#xff1a; 查看服务器es的license信息&#xff0c;发现 …

用「埋点」记录自己,不妄过一生

最近有朋友问我「埋点怎么做」&#xff0c;给朋友讲了一些互联网广告的案例&#xff0c;从源头的数据采集讲到末尾的应用分析和流量分配等&#xff08;此处省略N多字&#xff09; 解释完以后&#xff0c;我想到一个问题&#xff1a;有了埋点可以做分析&#xff0c;那我们对自己…

机器学习概论

一、机器学习概述 1、机器学习与人工智能、深度学习的关系 人工智能&#xff1a;机器展现的人类智能机器学习&#xff1a;计算机利用已有的数据(经验)&#xff0c;得出了某种模型&#xff0c;并利用此模型预测未来的一种方法。深度学习&#xff1a;实现机器学习的一种技术 2…

yum

什么是yum? Linux中我们也要进行工具/指令/程序&#xff0c;安装&#xff0c;检查卸载等&#xff0c;需要yum的软件 安装软件的方式&#xff1a; 1.源代码安装--交叉编译工作 2.rpm包直接安装 3.yum / apt-get yum:yum是我们linux预装的一个指令&#xff0c;搜索&#x…

【数据结构】顺序表和链表

顺序表和链表 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连…

uniapp 省市区三级联动选择器

还有半个小时下班&#xff0c;总想着发点光亮照耀他人。IT技术这东西&#xff0c;尤其是UI方面的东西&#xff0c;于用户体验至关重要&#xff0c;想想最近使用uni-data-picker的丑陋页面&#xff0c;自己重构了这个功能&#xff0c;新加实现&#xff0c;效果图如下&#xff0c…

SRC实战 | CORS跨资源共享漏洞

CORS跨资源共享 跨源资源共享 (CORS) 是一种浏览器机制&#xff0c;允许网页使用来自其他页面或域的资产和数据。 大多数站点需要使用资源和图像来运行它们的脚本。这些嵌入式资产存在安全风险&#xff0c;因为这些资产可能包含病毒或允许服务器访问黑客。 CORS响应头 CORS通…