首页 > 其他分享 >函数跳转栈帧流程分析

函数跳转栈帧流程分析

时间:2023-06-30 17:55:20浏览次数:44  
标签:流程 mov rbp sum eax 跳转 rsp 栈帧

一个简单跳转过程的分析

1.源代码如下

#include <stdio.h>
int sub(int d, int e) {
  return d - e;
}
int sum(int a, int b) {
   int c = sub(100, 9);
   return a + b + c;
}

int main(void) {
   int a = 12;
   int b = 98;
   int sum_result = sum(a, b);
   return 0;
}

2. 编译后汇编

0x555555555129 <sub>       endbr64         
0x55555555512d <sub+4>     push   %rbp     
0x55555555512e <sub+5>     mov    %rsp,%rbp
0x555555555131 <sub+8>     mov    %edi,-0x4(%rbp)
0x555555555134 <sub+11>    mov    %esi,-0x8(%rbp)
0x555555555137 <sub+14>    mov    -0x4(%rbp),%eax
0x55555555513a <sub+17>    sub    -0x8(%rbp),%eax
0x55555555513d <sub+20>    pop    %rbp     
0x55555555513e <sub+21>    retq            
   
0x55555555513f <sum>       endbr64
0x555555555143 <sum+4>     push   %rbp             
0x555555555144 <sum+5>     mov    %rsp,%rbp        
0x555555555147 <sum+8>     sub    $0x18,%rsp       
0x55555555514b <sum+12>    mov    %edi,-0x14(%rbp) 
0x55555555514e <sum+15>    mov    %esi,-0x18(%rbp) 
0x555555555151 <sum+18>    mov    $0x9,%esi        
0x555555555156 <sum+23>    mov    $0x64,%edi       
0x55555555515b <sum+28>    callq  0x555555555129 <sub>   
0x555555555160 <sum+33>    mov    %eax,-0x4(%rbp)  
0x555555555163 <sum+36>    mov    -0x14(%rbp),%edx 
0x555555555166 <sum+39>    mov    -0x18(%rbp),%eax 
0x555555555169 <sum+42>    add    %eax,%edx        
0x55555555516b <sum+44>    mov    -0x4(%rbp),%eax  
0x55555555516e <sum+47>    add    %edx,%eax        
0x555555555170 <sum+49>    leaveq                  
0x555555555171 <sum+50>    retq
   
0x555555555172 <main>      endbr64         
0x555555555176 <main+4>    push   %rbp     
0x555555555177 <main+5>    mov    %rsp,%rbp
0x55555555517a <main+8>    sub    $0x10,%rsp     
0x55555555517e <main+12>   movl   $0xc,-0xc(%rbp)
0x555555555185 <main+19>   movl   $0x62,-0x8(%rbp)                         
0x55555555518c <main+26>   mov    -0x8(%rbp),%edx
0x55555555518f <main+29>   mov    -0xc(%rbp),%eax
0x555555555192 <main+32>   mov    %edx,%esi
0x555555555194 <main+34>   mov    %eax,%edi
0x555555555196 <main+36>   callq  0x55555555513f <sum>                     
0x55555555519b <main+41>   mov    %eax,-0x4(%rbp)
0x55555555519e <main+44>   mov    $0x0,%eax
0x5555555551a3 <main+49>   leaveq          
0x5555555551a4 <main+50>   retq

3. 寄存器说明

  • %rsp :栈指针,指向当前函数栈帧的栈顶(最低位置)

  • rip: 指向当前正在执行的指令

  • %eax:要返回的值必须存储在%eax中(规定)

4. 指令说明

  • endbr64: 可以忽略,这个指令不会改变任何数据

  • push %rbp: 减小[%rsp],然后将值存入[%rsp]

    [%rsp] = [%rsp] - 8
    [%rsp] = [%rbp]
    

    注:%rsp中存储的是栈的地址,所以,这里并非将值存入寄存器,而是存储到%rsp所指向的栈地址

  • mov src dest: [dest] = [src]

  • movl $0xc,-0xc(%rbp) : 将立即数存人栈

  • callq sum: 跳转, 将当前指令的下一条指令地址压栈,之后跳回来继续执行

    [%rsp] = [%rsp] - 8
    [%rsp] = 下一条指令的地址,这里是0x55555555519b
    [%rip] = 0x55555555513f(sum所在地址,跳转到sum)
    
  • pop %rbp:

    [%rbp] = [%rsp]
    [%rsp] = [%rsp] + 8
    
  • retq:

    popq %rip:
    	[%rip] = [%rsp]
    	[%rsp] = [%rsp] + 8
    
  • leaveq:

    mov  %rbp, %rsp
    popq %rbp
    

5. 代码说明

假定起始时rsp = X

main()

  1. 将调用main()的函数的栈帧底存入栈中

    push %rbp:
    	%rsp = %rsp-8 = X-8
    	[%rsp] = [%rbp]
    
  2. 设置当前函数栈帧的底地址给rbp

    mov %rsp,%rbp
    
  3. 给当前函数创建栈帧,rsp指向栈帧顶

    sub $0x10,%rsp
    	rsp = rsp - 16 # 创建一个大小为16B的栈帧
    
  4. 接下来四行完成变量的创建,因为不能直接把数字放入寄存器,需要借助栈

  5. 接下来两行,把变量放入规定的传参寄存器

  6. 把返回执行地址放入栈中,令rip指向sum,完成跳转

    callq  0x55555555513f <sum>
    	[rsp] = [rsp] - 8
    	[rsp] = 下一条指令的地址,这里是0x5555,5555,519b
    	[rip] = sum所在地址,跳转到sum
    

此时栈帧

image-20230630171819711

sum()

前面和main函数类似,存储上一个函数的栈帧底,创建栈帧,将上一个函数传过来的参数取出,压入栈中,执行,然后跳到sub函数

此时栈帧

image-20230630172319663

sub()

前面也是类似,从pop %rbp开始介绍

此时栈帧如下

image-20230630172456366
  1. pop %rbp

    [%rbp] = [%rsp]
    [%rsp] = [%rsp] + 8
    

    此时%rbp指向rbp_sum%rsp指向sum返回地址

  2. retq

    [%rip] = [%rsp]
    [%rsp] = [%rsp] + 8
    

    此时rip指向sum返回地址,rsp指向sum函数的栈顶

完成跳回sum()

sum()

因为sub没有创建栈帧,所以返回容易一些,当创建了栈帧时,就需要借助leaveq指令完成返回

  1. leaveq

    1.mov %rbp, %rsp:
    		%rsp = %rbp
    2.popq %rbp:
    		[%rbp] = [%rsp]
    		[%rsp] = [%rsp] + 8
    

    此时%rbp指向rbp_main,rsp指向main的返回地址

  2. retq

    [%rip] = [%rsp]
    [%rsp] = [%rsp] + 8
    

    此时%rip指向main返回地址%rsp指向sum函数的栈顶

完成跳回main()

标签:流程,mov,rbp,sum,eax,跳转,rsp,栈帧
From: https://www.cnblogs.com/INnoVationv2/p/17517494.html

相关文章

  • Oracle向包里添加新存储过程的流程
    本次使用的工具是Plsql。一般情况下修改包里的存储过程只需要在Packages找到需要修改的包,右键EditSpec即可。但是假如要重新添加一条新的存储过程,使用上诉步骤之后,后台调用新存储过程的时候会报错,因为找不到新创建的存储过程,而且此时右键View包的时候,也找不到声明的存......
  • 硬件电路设计的基本流程、作用和注意事项
    硬件电路设计是一种设计电子设备硬件电路的过程,涉及多种电子元件的选型、连接方式、布局设计等工作。电子产品的功能都是靠硬件电路来实现的,硬件电路设计是电子产品设计的核心环节之一,也是电子工程师必备的一个技能。硬件问题越少对产品的影响就越小,这就体现出硬件电路设计的重要性......
  • BOSHIDA DC电源模块检测稳定性能详细流程
    BOSHIDADC电源模块检测稳定性能详细流程DC电源模块是电力电子产品中非常常见和重要的设备。它们被广泛应用于各种公共场所和工业领域,如通信系统、计算机、工业自动化以及医疗设备等。为确保电源的高稳定性和可靠性,必须要对其进行检测。下面是DC电源模块检测稳定性能的详细流程:1......
  • [远光|天骆] 企业统一流程平台
    企业统一流程平台远光天骆是一款对企业流程规划、建模、运行、运维、分析、监控、优化全生命周期可视化管理的企业流程管理平台,提供灵活的外部系统接入能力,实现跨系统、跨业务、跨组织的端到端链接,通过业务智能方案实时分析优化业务流程,支持流程智能自动化,积累业务数据资产,实现流......
  • SpringBoot整合 Camunda 流程引擎
    目录1整合Camunda流程引擎1.1简介1.1.1概念介绍1.1.2组件介绍1.2Springboot集成1.2.1pom.xml1.2.2配置文件1.2.3数据库1.2.4登录界面1.3绘制流程图1.3.1下载安装1.3.2绘制1.3.2.1任务分类1.3.2.2网关1.3.2.3指定key1.3.3集成在idea中1.3.4引入项目测试1整合......
  • 流程控制节点
    流程控制节点如何打开蓝图控制面板window->palette(调色板)开启键盘事件1.方法一开启角色控制权2.方法二添加Enableinput节点Branch分支节点Condition为条件,为真执行True为假执行False,类似于if-else语句a==b打印true,a!=b打印falseDelay延迟节点Duration设置......
  • C#基于海康视觉VM4.1的二次开发框架源码,有多流程框架 运动控制卡 服务框架 需要有海康
    C#基于海康视觉VM4.1的二次开发框架源码,有多流程框架运动控制卡服务框架需要有海康VM的基础并且有海康威视VM开发狗原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/668913688222.html......
  • 5.流程控制语句
    流程控制语句顺序语句特点:语句逐句执行选择语句特点:出现了一种以上的情况时使用循环语句在某个条件成立的情况下,循环执行某个语句、关键字:选择:if-else,which-case;循环:while,do-while,for,if-goto;辅助控制:continue,break,andsoon.1.if-else语句......
  • 如何优化生鲜配送系统开发流程?
    为了满足人们对食品的安全和快速配送的需求,如何优化生鲜配送系统开发流程是一个值得开发者们去思考的问题。一个高效的生鲜配送系统不仅提高配送效率,还能减少成本、提升客户满意度,并为企业带来竞争优势。接下来,名锐讯动MRT将介绍一些开发的关键策略,助力优化生鲜配送系统的开发流程......
  • 【后端面经-Java】公平锁和加锁流程
    目录1.公平锁和非公平锁1.1基本概念1.2ReentrantLock的公平锁和非公平锁2.加锁流程2.1ReentrantLock和AQS的关系2.2公平锁-加锁流程2.3非公平锁-加锁流程2.4加锁流程和性能的关系3.面试问题模拟参考文献1.公平锁和非公平锁1.1基本概念公平锁:线程按照到来的先后......