当前位置: 首页 > article >正文

Linux栈帧

相关寄存器&指令

寄存器

rax(accumulator):return value
rbx(base)
rcx(count):4st argument
rdx(data):3st argument
rsi(source index):2st argument
rdi(destination index):1st argument
rbp(base pointer)
rsp(stack pointer)
r8:5st argument
r9:6st argument
r10-r15

rip(instruction pointer)
rflags

传参顺序

前6个参数使用rdi、rsi、rdx、rcx、r8、r9,第7个及以后参数使用栈

call指令

相当于执行以下指令:
push %rip
jmp

ret指令

相当于执行以下指令:
pop %rip

leave指令

相当于执行以下指令:
mov %rbp,%rsp
pop %rbp

nop指令

no operation,空指令

指令后缀

b(8位)
w(16位)
l(32位)
q(64位)

c代码

int g(int a, int b)
{
    return a + b;
}

int f(int a, int b)
{
    return g(a, b);
}

int main()
{
    return f(1, 2);
}

编译&反汇编

gcc test.c -o test -g
objdump -dS test

c&汇编代码

00000000004004ed <g>:
int g(int a, int b)
{
  4004ed:	55                   	push   %rbp
  4004ee:	48 89 e5             	mov    %rsp,%rbp
  4004f1:	89 7d fc             	mov    %edi,-0x4(%rbp)
  4004f4:	89 75 f8             	mov    %esi,-0x8(%rbp)
    return a + b;
  4004f7:	8b 45 f8             	mov    -0x8(%rbp),%eax
  4004fa:	8b 55 fc             	mov    -0x4(%rbp),%edx
  4004fd:	01 d0                	add    %edx,%eax
}
  4004ff:	5d                   	pop    %rbp
  400500:	c3                   	retq

0000000000400501 <f>:

int f(int a, int b)
{
  400501:	55                   	push   %rbp
  400502:	48 89 e5             	mov    %rsp,%rbp
  400505:	48 83 ec 08          	sub    $0x8,%rsp
  400509:	89 7d fc             	mov    %edi,-0x4(%rbp)
  40050c:	89 75 f8             	mov    %esi,-0x8(%rbp)
    return g(a, b);
  40050f:	8b 55 f8             	mov    -0x8(%rbp),%edx
  400512:	8b 45 fc             	mov    -0x4(%rbp),%eax
  400515:	89 d6                	mov    %edx,%esi
  400517:	89 c7                	mov    %eax,%edi
  400519:	e8 cf ff ff ff       	callq  4004ed <g>
}
  40051e:	c9                   	leaveq
  40051f:	c3                   	retq

0000000000400520 <main>:

int main()
{
  400520:	55                   	push   %rbp
  400521:	48 89 e5             	mov    %rsp,%rbp
    return f(1, 2);
  400524:	be 02 00 00 00       	mov    $0x2,%esi
  400529:	bf 01 00 00 00       	mov    $0x1,%edi
  40052e:	e8 ce ff ff ff       	callq  400501 <f>
}
  400533:	5d                   	pop    %rbp
  400534:	c3                   	retq
  400535:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
  40053c:	00 00 00
  40053f:	90                   	nop

栈帧变化过程

不同颜色代表不同函数的栈帧,从上到下依次是__libc_start_main、main、f、g的栈帧
下一级函数的rbp指向上一级函数的rbp
在这里插入图片描述


http://www.kler.cn/a/441605.html

相关文章:

  • 【mptcp】ubuntu18.04和MT7981搭建mptcp测试环境操作说明
  • 最小距离和与带权最小距离和
  • 【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制
  • CentOS 7乱码问题如何解决?
  • 你还在用idea吗
  • 通过docker overlay2目录名查找容器名和容器ID
  • Ubuntu22.04搭建FTP服务器保姆级教程
  • SSM 电脑配件销售系统的高效设计与 JSP 实现技巧分享
  • sql server一些冷知识
  • node_modules文件夹删除失败解决办法
  • vue3 echarts tree结构实现点击添加子节点和修改图标样式
  • 基于streamlit搭简易前端页面
  • 二、STM32MP257安全启动流程简介
  • oracle多次替换字符,批量替换,循环替换------------gxl
  • 实战攻防中针对JS路径的泄露和Webpack漏洞的初探
  • 无人机故障安全模式设计逻辑与技术!
  • SQL -- 条件分支
  • OpenCV及基本用法
  • 原理 | dubbo [与 springboot 整合时服务导出的触发]
  • Java全栈项目 - 学生宿舍管理系统
  • 加载文件到docker中的mysql上
  • Linux高性能服务器编程 | 读书笔记 | 6. 高性能服务器程序框架
  • 【报错解决】pip install volcengine-python-sdk无法安装包
  • 【行政区编码对应表及生态等级数据的制作】-python
  • centos下安装ffmpeg
  • Python爬虫之代理的设置