本文研究的是arm架构的函数帧栈,阅读者需要有arm汇编基础,不过本文涉及的汇编指令不是很多。
理论上来说,ARM的15个通用寄存器是通用的,但实际上并非如此,特别是在过程调用的过程中。
以下4个寄存器有特殊用途:

R11:frame pointer,FP寄存器

R12:IP寄存器,用于暂存SP

R13:stack pointer,SP寄存器

R14:link register,LR寄存器

R15:PC寄存器

我们知道每个进程都有自己的栈,实际上每个函数也有自己的栈(尽管这些栈在空间上是连续的,都是在进程的栈上)。而在ARM上,函数的栈帧是由SP寄存器和FP寄存器来界定的。

我们写一个小程序来观察下函数的帧栈。

int fun(int a,int b)
{
   int c = 1;
   int d = 2;
   return 0;
}int main(int argc,char **argv)
{
   int a = 0;
   int b = 1;
   fun(a,b);
}

画出帧栈变化:

高地址  -----
        | fp   -- main函数也是被人调用的,所以也要保存调用者的fp。
main_fp -----
        | lr   -- main里调用了fun,会修改了lr,所以lr也要入栈,如果main里没有调用fun,不会有lr入栈这一步
        -----
        | 局部变量a
main 

Linux C高阶(5)arm架构函数帧栈分析相关推荐

  1. 原生js循环展示dom_web前端教程:JS高阶编程技巧-惰性函数

    框架(framework)是一个框子--指其约束性,也是一个架子--指其支撑性.是一个基本概念上的结构,用于去解决或者处理复杂的问题. Web前端教程 框架这个广泛的定义使用的十分流行,尤其在软件概念 ...

  2. 产品高阶能力:架构图的设计与画法

    一.基于抽象和复杂对产品经理个人能力的一些思考 日常的工作中,假如你身边坐了一个女程序猿,为了让乏味的工作氛围增加点提神的荷尔蒙,文艺又懂点技术的你可能会对她说:小姐姐,我能把世间万物抽象成一个类,但 ...

  3. Linux海量数据高并发实时同步架构方案杂谈

    不论是Redhat还是CentOS系统,除去从CDN缓存或者数据库优化.动静分离等方面来说,在架构层面上,实 现海量数据高并发实时同步访问概括起来大概可以从以下几个方面去入手,当然NFS的存储也可以是 ...

  4. arm linux读cpu id,基于ARM架构的芯片获取CPU信息(cpuID)的多种方法

    由于工作的原因,要获取到ARM芯片的cpuid. 了解下存储cpu信息的寄存器内容: CPUID寄存器内容: 字段名:Implementer(venter 销售ID)|Variant(大版本号) | ...

  5. linux 高并发文件实时同步,Linux海量数据高并发实时同步架构方案杂谈

    不论是Redhat还是CentOS系统,除去从CDN缓存或者数据库优化.动静分离等方面来说,在架构层面上,实 现海量数据高并发实时同步访问概括起来大概可以从以下几个方面去入手,当然NFS的存储也可以是 ...

  6. Linux C高阶(21)监听键盘单个按键输入

    文章目录 1 前言 2 终端IO的三种模式 2.1 canonical 模式 2.2 nocanonical 模式 2.3 raw 模式 3 终端控制结构 1 前言 编写测试工具的时候,需要实时的读取 ...

  7. Linux C高阶(7)异步处理框架C实现

    引子 今天跟大家分享一个我在实际工作中运用得最多的框架:异步执行队列. 在开发中,我们可能经常会遇到一些执行时间需要很长的任务,如果让程序处理完任务再继续往下走,可能会耽误到程序的主体业务.我们通常的 ...

  8. Linux C高阶(14)C语言宏定义你所不知道的事

    文章目录 规避语法错误 什么时候使用宏定义 规避语法错误 众所周知,C语言支持宏定义,并且功能强大.举个例子: #include <stdio.h> #define swap(a,b) { ...

  9. Linux系统查看服务器是arm架构还是x86架构

    命令:uname -m 示例: tyb@amax:~$ uname -m x86_64

最新文章

  1. html class css,div id class
  2. windows ce 5.0 + vs2005 + sql数据库_开发注意事项
  3. 在阿里云主机上基于CentOS用vsftpd搭建FTP服务器
  4. 计算机网络连接能否隐藏位置,如何能在局域网中隐藏电脑及IP地址
  5. 安卓使用JNI-NDK
  6. Asp.Net 分段,断点,下载
  7. 副主任护师主要英语和计算机吗,有没有晋升副主任护师的
  8. NGINX + TOMCAT7 + MEMCACHED 实现SESSION 共享
  9. linux系统查看磁盘信息
  10. jdk,Eclipse,SWTDesigner安装【原创】
  11. 【工具使用系列】关于 MATLAB 非线性控制,你需要知道的事
  12. 在 Intellij IDEA 中 调试 angular e2e test
  13. mysql 表数据压缩_mysql表数据压缩
  14. 服务器虚拟化可以节约成本吗?—硬件开支篇
  15. python语法学习第三天--列表
  16. Java 引用jar包
  17. 来自TMDB的5000部电影数据集
  18. mysql数据驱动问题hour_day_of 0 ->1
  19. 【WINRAR安装和使用教程】常用压缩软件
  20. python画气泡图_画气泡图的十二个图表库

热门文章

  1. Linux下安装redis以及常用命令
  2. CSS3动画正方体3D旋转
  3. navicat_premium连接Oracle数据库
  4. 我是一个转行的程序员(一) | 青鸟之忆
  5. 矩阵理论及其应用_多能源网络的广义电路分析理论及其应用
  6. python numpy逆_python-具有numpy的N * M * M张量的矢量化(部分)逆
  7. docker镜像格式
  8. org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /nb-conf
  9. 基于CAMx的空气质量模拟及污染来源解析技术与案例分析
  10. 数据结构之——《栈》