ARM指针寄存器 -程序计数器PC、堆栈指针SP

发布者:纸扇轻摇最新更新时间:2020-03-29 来源: eefocus关键字:ARM  指针寄存器  程序计数器PC  堆栈指针SP 手机看文章 扫描二维码
随时随地手机看文章

堆栈是一种具有“后进先出”(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 也可以用做通用数据寄存器

 

深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。

PC 代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:


1.取指(从存储器装载一条指令);

2.译码(识别将要被执行的指令);3.执行(处理 指令并将结果写回寄存器)。而R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定 将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址 加8字节的地址,即:PC值=当前程序执行位置+8;


ARM指令是三级流水线,取指,译指,执行时同时执行的,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(假设在ARM状态 下,一个指令占4个字节),cpu正在执行的指令地址是PC-8,也就是说PC所指向的地址和现在所执行的指令地址相差8。


当突然发生中断的时候,保存的是PC的地址

这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pc lr-irq #4。


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,否则后果不可预测。


ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供0.9MIPS/MHZ的指令执行速度。

关键字:ARM  指针寄存器  程序计数器PC  堆栈指针SP 引用地址:ARM指针寄存器 -程序计数器PC、堆栈指针SP

上一篇:初始化ARM处理器各模式下的堆栈指针SP(R13)
下一篇:3.堆栈指针寄存器 SP 详解

推荐阅读最新更新时间:2024-11-09 23:19

AMR、ARM和MRM技术简介
  AMR、arm和MRM技术简介一、AMR简介AMR(Audio/MODEM Riser,声音/调制解调器插卡)是一套开放工业标准,它定义的扩展卡可同时支持声音及MODEM功能。采用这种设计,可有效降低成本,同时解决声音与MODEM子系统目前在功能上的一些限制。     人们其实早就想把MODEM子系统集成到主板上,但由于存在电磁干扰以及另一些不方便的因素,所以MODEM最重要的模拟I/O(编码/译码器和DAA)电路暂时还不能直接焊到主板上。Intel公司之所以制订这套AMR规则,很重要的一个目的就是解决这个问题,将模拟I/O电路转移到单独的插卡中,其他部件则留在主板上。     另外,声音子系统目前也不能十全十美地集成到主板,
[单片机]
ARM·电源电路/复位电路/GPIO
【电源电路】 硬件电路,关于【LM117】 LM117的输出电压的范围是1.25-37v连续可调,最大电流1.5A,三端可调线性稳压电路 ; (这里不明白c9和c18这两个极性电容的作用) 【复位电路】 MAX811(4引脚的电压监视器) 引脚功能: 分析复位电路 引脚1 GND 引脚4 3.3v的VCC (这里VCC和GND之间的104电容,是去耦电容,以后会经常遇到;一是作为集成电路的蓄能电容;二是滤除该器件产生的高频噪声,切断其功能回路传播的通路;三是防止电源携带的噪声对电路构成干扰) 引脚2 低电平复位有效输出,这是内部系统的软件复位; 引脚3 手动复位,也就是外部的复
[单片机]
基于ARM9和QT的步进电机驱动控制系统
  嵌入式控制系统以其低功耗、低成本、高性能等优势被广泛用于工业控制领域,而在嵌入式控制系统中步进电机驱动控制技术是关键技术之一。在步进电机控制系统设计中,传统的方法是用逻辑电路或单片机实现步进电机控制,虽然此方法可行,但由于线路复杂而且制成后不易调整,存在一定的局限性。随着嵌入式技术的发展,越来越多的智能化带有界面控制功能的小型设备深入到人们生活当中。开发者基于嵌入式领域中的Qt技术,设计出一套应用于工控领域的具有人机交互界面的智能控制统,Qt是挪威TrolLTEch着名的标志性产品,采用C++作为程序设计语言,已经成为用C++GUI工具包在Linux上进行自由软件开发的主流,是Linux上流行的KDE桌面环境的基础。Qt/Em
[单片机]
基于<font color='red'>ARM</font>9和QT的步进电机驱动控制系统
15. 从0开始学ARM-位置无关码
一、为什么需要位置无关码? 首先我们需要了解一下ARM板子的启动流程。 1. exynos 4412启动流程 首先看一下 exynos 4412 memory map : 可知: iROM基地址是0x00000000 iRAM基地址是0x02020000 这两块内存都在 SOC中。 查看exynos 4412 Booting Sequence: 位于第五章。 上图是exynos4412上电复位时的启动流程,大致如下: 1 执行内部只读存储器iROM中的一段代码(厂家固化在里面的),这段代码主要是初始化一些系统的基本配置,比如初步时钟配置、堆栈、启动模式(对应图中的标志①)。 2 iROM中的代码根据阶段一获取的启动模
[单片机]
15. 从0开始学<font color='red'>ARM</font>-位置无关码
ARM装配说明MCR/MRC学习
MCR指令ARM数据寄存器传送到协处理器寄存器。假设协处理器不能成功运行操作。会产生未定义指令中止。 语法教学格式: MCR{ cond } p15, 0, Rd , CRn , CRm {, opcode_2 } MCR2 p15, 0, Rd , CRn , CRm {, opcode_2 } 当中。 cond 为指令运行的条件码。当 cond 忽略时指令为无条件运行。MCR2中, cond 为Ob1,指令为无条件运行指令。 opcode_1 为协处理器将运行的操作的操作码。 对于CP15协处理器来说, opcode_1 永远为0b,当 opcode_1 不为0b时,该指令操作结果不可预知。 Rd 作为元寄存
[单片机]
ARM中断向量表重定位到片外RAM方法
由于ARM CPU产生中断或者异常后,PC指针自动跳转到0x00地址执行(同时执行一些CPSR寄存器的保存、运行模式的转换等),所以要在0x00地址处存放中断向量表。而如果我们想将中断向量表重定位到片外ram的 话, 有2中方法: 1、启用MMU 将片外RAM空间隐射到0x00处 2、在0x00(片内RAM)地址处存放一份和片外RAM一模一样的中断向量表 标准做法是将程序存放在NAND FLASH里面,S3C2440 CPU启动后,会将程序复制到片内RAM里面,此时中断向量表也复制到了IRAM里 3、有部分CPU支持设置中断向量表的寄存器 这样也可以实现重定位
[单片机]
Cortex-A8和ARM11区别
Cortex-A8:基于ARMv7指令架构,运行速度可以达600MHz至1GHz,功耗在300mW以下。Cortex-A8处理器复杂的流水线架构基于双对称的,顺序发射的,13级流水线,带有先进的动态分支预测,可实现2.0 DMIPS/MHz。10级NEON媒体流水线,专用的L2缓存,带有可编程的等待状态,支持多项与L3存储器之间的未完成事务,以充分利用CPU。 ARM11:基于ARMv6指令架构,运行频率300MHz-500MHz,在0.13um工艺,1.2v条件下,ARM11处理器的功耗可以低至0.4mW/MHz。ARMv6保持了所有过去架构中的T(Thumb指令)和E(DSP指令)扩展,ARM11处理器的流水线由8级流水线组成
[单片机]
ARMLinux驱动Watch Dog Timer(看门狗)驱动分析
硬件平台:FL2440 内核版本:2.6.28 主机平台:Ubuntu 11,04 内核版本:2.6.39 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/6595265 1、看门狗驱动的原理 下图是看门狗驱动的原理图 可以看出,PCLK是系统时钟,经过8位的预分频,然后再被分频(16、32、64、128)然后产生计数脉冲,进行计数,当计数器WTCNT加到0或减到0,然后产生中断,或引起系统复位。所以要隔一段时间,重置WTCNT的值,防止WTCNT减到0,称之 喂狗 。 2、驱动分析 下面是自己的驱动分析,如有理解错误,请指正 注,为了尽
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved