ARM 内核SP,LR,PC寄存器
深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。
1、堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。
2、连接寄存器r14(LR):每种模式下r14都有自身版组,它有两个特殊功能。
(1)保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回,通常用下列指令之一:
MOV PC, LR
BX LR
通常子程序这样写,保证了子程序中还可以调用子程序。
stmfd sp!, {lr}
……
ldmfd sp!, {pc}
(2)当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。
3、程序计数器r15(PC):PC是有读写限制的。当没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00。当用str或stm存储PC的时候,偏移量有可能是8或12等其它值。在V3及以下版本中,写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00,否则后果不可预测。
堆栈是一种具有“后进先出”(LIFO---Last In First Out)特殊访问属性的存储结构。堆栈一般使用RAM 物理资源作为存储体,再加上LIFO 访问接口实现。
堆栈的实现方法:
在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为‘压栈’(push )。通常用一个指针(堆栈指针 SP---Stack Pointer)实现做一次调整,SP 总指向最后一个压入堆栈的数据所在的数据单元(栈顶)。从堆栈中读取数据时,按照堆栈 指针指向的堆栈单元读取堆栈数据,这个过程叫做 ‘弹出’(pop ),每弹出一个数据,SP 即向相反方向做一次调整,如此就实现了后进先出的原则。
堆栈是计算机中广泛应用的技术,基于堆栈具有的数据进出LIFO特性,常应用于保存中断断点、保存子程序调用返回点、保存CPU现场数据等,也用于程序间传递参数。
ARM处理器中通常将寄存器R13作为堆栈指针(SP)。ARM处理器针对不同的模式,共有 6 个堆栈指针(SP),其中用户模式和系统模式共用一个SP,每种异常模式都有各自专用的R13寄存器(SP)。它们通常指向各模式所对应的专用堆栈,也就是ARM处理器允许用户程序有六个不同的堆栈空间。这些堆栈指针分别为R13、R13_svc、R13_abt、R13_und、R13_irq、R13_fiq,如表2-3 堆栈指针寄存器所示。
为了更准确地描述堆栈,根据“压栈”操作时堆栈指针的增减方向,将堆栈区分为‘递增堆栈’(SP 向大数值方向变化)和‘递减堆栈’(SP 向小数值方向变化);又根据SP 指针指向的存储单元是否含有堆栈数据,又将堆栈区分为‘满堆栈’(SP 指向单元含有堆栈有效数据)和‘空堆栈’(SP 指向单元不含有堆栈有效数据)。
这样两两组合共有四种堆栈方式——满递增、空递增、满递减和空递减。
ARM处理器的堆栈操作具有非常大的灵活性,对这四种类型的堆栈都支持。
ARM处理器中的R13被用作SP。当不使用堆栈时,R13 也可以用做通用数据寄存器。
最新文章
- mysql 存储过程 游标 判断游标是否为空
- 【PHP面向对象(OOP)编程入门教程】6.如何去使用对象中的成员
- 使用CocoaPods配置工程
- javascript 封装分页
- OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
- English Notes
- memcache保存php的session 解决多服务器的session问题
- ThinkPad X220i 刷白名单BIOS,改装第三方无线网卡
- C#基础(三)
- ios中label的文字多种颜色显示
- [置顶] 如何运行用记事本写的java程序
- 织梦dedecms5.7后台进去就卡死解决方法
- 【Python学习】由于windows环境问题导致的不能安装某些需要VC编译的插件
- Python 元组内置函数
- 记录SSM框架项目迁移SpringBoot框架-----pom.xml的迁移
- License分类 + 引入开源软件时License的注意事项
- 解决阿里云无法正常使用samba的问题【转】
- Hexo博客部署codingNet静态资源无法加载
- SpringInAction--自动化装配(显示装配之 java注解配置)
- Spring随笔 —— IOC配置的三种不同方式简介
热门文章
- C# 事件浅析
- go——基本构成要素
- MySQL的搜索引擎,统一字符编码 和忘记MySQL密码如何破解
- 转:css中!important的作用
- Spring框架学习之IOC(一)
- 二叉树遍历,递归,栈,Morris
- 使用 getopt 处理命令行长参数
- 【Head First Servlets and JSP】笔记20:EL以及<;jsp:useBean ....>;的补充
- 20145219 《Java程序设计》实验三 敏捷开发与XP实践
- 2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告