深入理解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 也可以用做通用数据寄存器。

最新文章

  1. mysql 存储过程 游标 判断游标是否为空
  2. 【PHP面向对象(OOP)编程入门教程】6.如何去使用对象中的成员
  3. 使用CocoaPods配置工程
  4. javascript 封装分页
  5. OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
  6. English Notes
  7. memcache保存php的session 解决多服务器的session问题
  8. ThinkPad X220i 刷白名单BIOS,改装第三方无线网卡
  9. C#基础(三)
  10. ios中label的文字多种颜色显示
  11. [置顶] 如何运行用记事本写的java程序
  12. 织梦dedecms5.7后台进去就卡死解决方法
  13. 【Python学习】由于windows环境问题导致的不能安装某些需要VC编译的插件
  14. Python 元组内置函数
  15. 记录SSM框架项目迁移SpringBoot框架-----pom.xml的迁移
  16. License分类 + 引入开源软件时License的注意事项
  17. 解决阿里云无法正常使用samba的问题【转】
  18. Hexo博客部署codingNet静态资源无法加载
  19. SpringInAction--自动化装配(显示装配之 java注解配置)
  20. Spring随笔 —— IOC配置的三种不同方式简介

热门文章

  1. C# 事件浅析
  2. go——基本构成要素
  3. MySQL的搜索引擎,统一字符编码 和忘记MySQL密码如何破解
  4. 转:css中!important的作用
  5. Spring框架学习之IOC(一)
  6. 二叉树遍历,递归,栈,Morris
  7. 使用 getopt 处理命令行长参数
  8. 【Head First Servlets and JSP】笔记20:EL以及<jsp:useBean ....>的补充
  9. 20145219 《Java程序设计》实验三 敏捷开发与XP实践
  10. 2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告