APCS(ARM Procedure Call Standard)

1、ARM寄存器

ARM核支持9种工作模式——User/System/Hyp+/SVC/Abort/Undefined/Monitor/IRQ/FIQ。

ARM核包含37个通用寄存器(ARMv7架构8种工作模式时为37个通用寄存器)以及额外的专用寄存器,如CPSR(Current Processor Status Register)。

r0~r3通常用来作为函数入参(从左到右的顺序,大于4个参数使用栈来传递)和返回值。在函数内部,r0~r3也可以用来存储局部变量。

r12(IP)可能在函数调用时被链接器使用,在函数内部,也可以用来存储局部变量。

r9为平台特殊寄存器,不同应用场景,使用方式不一样。

r4~r8, r10和r11用来保存局部变量。r11通常用来作为FP(Frame Pointer)保存栈基地址。

r13为SP寄存器,即当前函数栈顶指针。

r14为LR寄存器,即当前函数的返回地址。

r15为PC寄存器,即将要执行的指令地址。

2、CPSR寄存器

CPSR为当前程序状态寄存器,存放以下内容:

1)APSR标记

2) 当前处理器模式

3) 中断禁用标志

4) 当前处理器状态(ARM/Thumb/ThumbEE/Jazelle等)

5) IT块的执行状态位

N(Negative Condition Flag) 计算结果为负数时为1,为0和正数时为0

Z(Zero Condition Flag) 计算结果为0时为1,否则为0

C(Carry Condition Flag) 进位标志,无符号数溢出为1

V(Overflow Condition Flag) 溢出标志,有符号数溢出为1

Q(Cumulative Saturation Bit) 累加和溢出标志,溢出时为1

PAN(Privileged Access Never) 特权级别

DIT(Data Independent Timing)

GE(Greater than or Equal flags) 大于或者等于标志

E(Endianness State Bit) 大小端标志,0为小端模式,1为大端模式

A(SError interrupt mask bit) Abort掩码标志 0-Exception not masked, 1-Exception masked

I(IRQ mask bit) IRQ掩码标志 0-Exception not masked, 1-Exception masked

F(FIQ mask bit) FIQ掩码标志 0-Exception not masked, 1-Exception masked

M(Current PE mode) 运行模式:

0b0000 User.
0b0001 FIQ.
0b0010 IRQ.
0b0011 Supervisor.
0b0110 Monitor.
0b0111 Abort.
0b1010 Hyp.
0b1011 Undefined.
0b1111 System.

3、进程、内存和栈

进程是一段执行代码的实例,在Linux系统种,进程在用户态和内核态可以访问的内存区域是不一样的。

进程可以访问的内存段分为五类:

1)代码段,只读

2)只读静态数据段

3)可读写静态数据段(可进一步划分为初始化数据段、初始化为零数据段、未初始化数据段)

4)堆(堆空间的内存是由进程自己管理的,如使用malloc()/free()申请和释放)

5)栈(以上五类内存段中,只有栈空间需要分配一段连续的内存段)

一个进程必须有至少一个代码段,以及一个栈空间,其他的内存段都不是必需的。

3.1、栈

ARM的栈是满递减栈(full-descending),SP(r13)寄存器保存栈顶指针。栈必须满足以下条件:

1)Stack-limit < SP <= stack-base (栈大小为stack-base - SP)

2)SP必须是4字节对齐,对于公共接口,SP必须8字节对齐

3.2、C程序存储布局

ARM平台的进程内存空间布局如上图,栈从上往下增长,堆从下往上增长,堆以下的低地址依次为代码段、初始化数据段、未初始化数据段(BSS)。

1)初始化数据段,静态内存分配,存储初始化的全局变量

2)未初始化数据段,静态内存分配,存储未初始化全局变量

3.3、变量

变量有三个属性:

1)变量类型(int,float,double,char,...)

2)声明位置(全局变量,局部变量)

3)存储类别,决定变量的存储位置

4、函数调用

ARM和Thumb指令集均使用BL指令实现带返回的函数跳转,BL指令将当前PC值(下一条执行指令地址)保存到LR寄存器中,然后往PC寄存器写入被调函数入口地址。

Thumb模式LR寄存器的最低位为1,ARM模式LR寄存器的最低位为0。

4.1、栈帧(Stack Frame)

函数调用过程中的一个很重要的概念就是栈帧,每一级调用函数一个栈帧,在进程栈空间中相邻的连续内存段。函数调用时,首先压栈LR和FP,即保存函数返回地址和栈基地址(上一级函数SP-4)。

ARM过程调用标准——APCS的更多相关文章

  1. ARM过程调用标准---APCS简单介绍

    介绍 APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程能够与其它例程交织在一起.最显著的一点是对这些例程来自哪里没有 ...

  2. 从汇编角度分析C语言的过程调用

    ➠更多技术干货请戳:听云博客 基本术语定义 1.系统栈(system stack)是一个内存区,位于进程地址空间的末端. 2.在将数据压栈时,栈是自顶向下增长的,该内存区用于函数的局部变量提供内存.它 ...

  3. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

  4. Thrift架构~从图中理解thrift,它事实上是一种远程过程调用

    thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...

  5. RPC-远程过程调用协议

    远程过程调用协议 同义词 RPC一般指远程过程调用协议 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要 ...

  6. 无效的过程调用或参数: 'Instr'解决方法

    以前我一直使用ASP无组件上传类来上传文件.但是今天又个客户反映说.不能上传.出现错误.,但在我电脑上测试没问题.后来发现客户用的是IE8 于是开始找解决方法 错误如下:Microsoft VBScr ...

  7. Wayland中的跨进程过程调用浅析

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...

  8. 【CSAPP笔记】7. 汇编语言——过程调用

    一个过程调用包括将数据(以参数和返回值的形式)与控制从代码的一部分传递到另一部分.除此之外,在进入时为过程的局部变量分配空间,在退出的时候释放这些空间.数据传递.局部变量的分配和释放通过操纵程序栈来实 ...

  9. fortran 函数的调用标准

    Fortran函数的调用标准在编译时使用iface声明.如iface:default.表示採用的是default标准. fortran的调用标准有 [1] default: Tells the com ...

随机推荐

  1. how to create a flask server

    1. use database 2. use redis 3. inport/export excel2007 version+ from flask import send_from_directo ...

  2. Mac下的常用快捷键总结

    由于在公司的时候是使用的Windows下进行开发工作,但是回家之后,有时候要使用自己的Mac进行开发等工作,那么流利的使用快捷键就变得尤其的重要. 1. 退出软件 cmd + q 2.将最前面的窗口最 ...

  3. vue与react对比

    相同点 1.都使用 virtual DOM 2.都是组件化开发 or 都提供了组件化的视图组件 3.数据的改变会引起视图的二次渲染 4.都只有骨架,其他的功能如路由.状态管理等是框架分离的组件. 5. ...

  4. Solaris下truss的使用

    Solaris下truss的使用 原文转载:http://blog.csdn.net/sunlin5000/article/details/6560736 在Solaris下面,如果需要跟踪系统的调用 ...

  5. redis、rabitmq对比

    redis.rabitmq对比 原文地址 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性 ...

  6. 性能测试:oprofile的学习使用

    一.oprofile简介 Oprofile是linux上的性能监测工具,有人说是性能测试的神器.通过CPU硬件提供的性能计数器对事件进行采样,从代码层面分析程序的性能消耗情况,找出程序性能的问题点. ...

  7. qtwebkit 启动时间慢

    qtwebkit 启动时间慢 qtwebkit 启动时间慢 qtwebkit 启动时间慢

  8. JavaScript双重排序

    前言:正好这两天正在做一个功能,需要在前台进行排序展示,因为是动态的,后台排序不能搞定,只能咋前台通过JS来进行排序展示,所以我们用sort()来解决这个问题,sort不仅能给数组,对象,集合进行简单 ...

  9. 【译文】Git merge 和 Git rebase比较

    [译文]Git merge 和 Git rebase比较 原创: 胡江华 胡同学和朋友们的成长日记 2017-03-22 git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之 ...

  10. windows环境下 RabbitMQ 安装时创建用户流程命令

    https://blog.csdn.net/xiaojieblog/article/details/70332469