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

news2024/11/26 20:35:32

预备


#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.coloradmin.cn/o/1178944.html

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

相关文章

前端食堂技术周刊第 103 期:10 月登陆 Web 平台的新功能、TS 5.3 RC、React 2023 状态、高并发的哲学原理、Web 资源加载优先级

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;夏梦玫珑 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

数据集划分:手动划分文件夹中的图片数据集为训练集、验证集和测试集

1.需求 手动划分文件夹中的图片数据集为训练集、验证集和测试集&#xff0c;即进行文件夹中的数据集&#xff08;都是图片&#xff09;进行划分。 2.步骤 使用文件处理库&#xff08;如os&#xff09;遍历读取文件夹中的图片文件。将读取到的图片文件路径存储到列表中。打乱…

8、Python模块和包:导入模块、创建自己的模块和包

文章目录 Python模块和包:导入模块、创建自己的模块和包导入模块创建自己的模块创建包使用相对导入结论Python模块和包:导入模块、创建自己的模块和包 Python是一种功能强大的编程语言,它的模块和包系统是其强大功能的基石之一。在Python中,模块是包含Python定义和声明的文…

【MySQL事务篇】多版本并发控制(MVCC)

多版本并发控制(MVCC) 文章目录 多版本并发控制(MVCC)1. 概述2. 快照读与当前读2.1 快照读2.2 当前读 3. MVCC实现原理之ReadView3.1 ReadView概述3.2 设计思路3.3 ReadView的规则3.4 MVCC整体操作流程 4. 举例说明4.1 READ COMMITTED隔离级别下4.2 REPEATABLE READ隔离级别下 …

viewBinding与反射结合的实用实践

首先&#xff0c;官方教程指个路&#xff1a;视图绑定 本文阅读认真阅读大约需要5-20分钟 也可直接跳到文末3.0看最终方案 目录 1 关于ViewBinding第一点&#xff0c;命名符合一定的规则第二点&#xff0c;继承自ViewBinding 2 正常使用不便之处3 话不多说直接看代码1.04 话不…

数据结构与算法之美学习笔记:16 | 二分查找(下):如何快速定位IP对应的省份地址?

目录 前言二分查找的变形问题变体一&#xff1a;查找第一个值等于给定值的元素变体二&#xff1a;查找最后一个值等于给定值的元素变体三&#xff1a;查找第一个大于等于给定值的元素变体四&#xff1a;查找最后一个小于等于给定值的元素 解答开篇内容小结 前言 本节课程思维导…

vue3+ts 项目遇到的问题和bug

1.router中使用pinia报错 pinia.mjs:1709 Uncaught Error: [&#x1f34d;]: "getActivePinia()" was called but there was no active Pinia. Are you trying to use a store before calling "app.use(pinia)"? See https://pinia.vuejs.org/core-concep…

[科研图像处理]用matlab平替image-j,有点麻烦,但很灵活!

做材料与生物相关方向的同学应该对image-j并不陌生&#xff0c;前几天有个师兄拜托我用image-j分析一些图片&#xff0c;但使用过后发现我由于不了解image-j的工作流程而对结果并不确信&#xff0c;而且image-j的功能无法拓展&#xff0c;对有些图片的处理效果并不好&#xff0…

【网络协议】聊聊HTTPDNS如何工作的

传统 DNS 存在哪些问题&#xff1f; 域名缓存问题 我们知道CND会进行域名解析&#xff0c;但是由于本地会进行缓存对应的域名-ip地址&#xff0c;所以可能出现过期数据的情况。 域名转发问题 出口 NAT 问题 域名更新问题 解析延迟问题 因为在解析DNS的时候&#xff0c;需要进行…

【C语言】函数的系统化精讲(二)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 &#x1f308;作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心的勇气和无限的潜能&#xff0c;只要你有决心&#xff0c;就没有什么事情是不可能的…

vue3错误排查-POST请求的body参数 传参方式form-data和json

问题&#xff1a;vue3实现登录功能&#xff0c;登录成功后 跳转到登陆后的界面 一秒后 闪退回登录页 对应的输出结果也一闪而过&#xff0c;反复复查了代码&#xff0c;没问题。 自测&#xff1a;进行断点输出调试。强行跳转到登陆后的界面&#xff0c;查看输出的结果。 没有报…

安全操作(安卓推流)程序

★ 安全操作项目 项目描述&#xff1a;安全操作项目旨在提高医疗设备的安全性&#xff0c;特别是在医生离开操作屏幕时&#xff0c;以减少非授权人员的误操作风险。为实现这一目标&#xff0c;我们采用多层次的保护措施&#xff0c;包括人脸识别、姿势检测以及二维码识别等技术…

Linux 实现原理 — NUMA 多核架构中的多线程调度开销与性能优化

前言 NOTE&#xff1a;本文中所指 “线程” 均为可执行调度单元 Kernel Thread。 NUMA 体系结构 NUMA&#xff08;Non-Uniform Memory Access&#xff0c;非一致性存储器访问&#xff09;的设计理念是将 CPU 和 Main Memory 进行分区自治&#xff08;Local NUMA node&#x…

1070 结绳

一.问题&#xff1a; 给定一段一段的绳子&#xff0c;你需要把它们串成一条绳。每次串连的时候&#xff0c;是把两段绳子对折&#xff0c;再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子&#xff0c;可以再次对折去跟另一段绳子串连。每次串连后&#xff0c;原来…

【网络安全 --- web服务器解析漏洞】IIS,Apache,Nginx中间件常见解析漏洞

一&#xff0c;工具及环境准备 以下都是超详细保姆级安装教程&#xff0c;缺什么安装什么即可&#xff08;提供镜像工具资源&#xff09; 1-1 VMware 16.0 安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客文章浏览阅读20…

Android Datastore 动态创建与源码解析

涉及到的知识点 1、协程原理---->很好的博客介绍&#xff0c;一个小故事讲明白进程、线程、Kotlin 协程到底啥关系&#xff1f; 2、Channel知识点---->Android—kotlin-Channel超详细讲解 3、Coroutines : CompletableDeferred and structured concurrency 封装的DataS…

动态规划-丑数

** 描述 把只包含质因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。例如6、8都是丑数&#xff0c;但14不是&#xff0c;因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第 n个丑数。 数据范围&#xff1a; 0≤n≤2000 要求&#x…

Mysql数据库 9.SQL语言 查询语句 连接查询、子查询

连接查询 通过查询多张表&#xff0c;用连接查询进行多表联合查询 关键字&#xff1a;inner join 内连接 left join 左连接 right join 右连接 数据准备 创建新的数据库&#xff1a;create database 数据库名; create database db_test2; 使用数据库&#xff1a;use 数据…

企业如何搭建智能客服系统?

在数字化时代&#xff0c;企业面临着客户需求多样化、市场竞争日益激烈等多重挑战。为了更好地满足客户的需求、提供高效的服务&#xff0c;越来越多的企业开始搭建智能客服系统。智能客服系统结合了人工智能和自然语言处理技术&#xff0c;可以实现自动回复、智能推荐以及数据…

Linux内核移植之主频设置

一. Linux内核移植 正点原子 ALPHA开发板已经添加到 Linux内核里面去了&#xff0c;前面文章关于如何添加已经掌握。但是&#xff0c;还有一些驱动的问题需要修改。 正点原子 I.MX6U-ALPHA 开发板所使用的 I.MX6ULL 芯片主频都是 792MHz 的&#xff0c;也就是NXP 官方宣…