历史上的今天
返回首页

历史上的今天

今天是:2025年03月29日(星期六)

2020年03月29日 | ARM指针寄存器 -程序计数器PC、堆栈指针SP

2020-03-29 来源:eefocus

堆栈是一种具有“后进先出”(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的指令执行速度。

推荐阅读

史海拾趣

Chemtronics公司的发展小趣事

Chemtronics一直坚守严格的质量标准。公司自早期起就遵循ISO9001:2000的质量标准来制造产品,确保每一款产品都达到同等高质量。这种对质量的坚持不仅赢得了客户的信任,也为公司在竞争激烈的电子行业中树立了良好的口碑。

Fagor Electrónica公司的发展小趣事

1959年,Fagor Electrónica在电子领域崭露头角,当时它还只是Ulgor, S. Coop.公司旗下的一个电子部门。这一年,公司开始制造硒板和整流器,这标志着其电子制造业务的开始。尽管初始规模不大,但Fagor Electrónica凭借其高质量的产品和卓越的客户服务,迅速在市场上赢得了声誉。

品赞(G-Switch)公司的发展小趣事
检查控制回路中的接线是否正确,各元件是否损坏。
Arcolectric公司的发展小趣事

随着技术的不断进步和市场需求的日益多样化,Arcolectric开始积极拓展其产品线,并逐渐将产品应用于电脑、电源设备及家用电器等多个领域。公司通过不断创新和研发,成功推出了一系列符合市场需求的新产品,进一步扩大了市场份额。

Greatbatch-Sierra Inc公司的发展小趣事

Arcolectric始终坚持品质至上的原则,对产品的每一个环节都进行严格的质量控制。公司不仅通过国际制造架构的合作来确保产品的高品质,还积极引进先进的生产设备和技术人才,不断提升产品的性能和可靠性。这种对品质的执着追求使得Arcolectric的产品在全球范围内得到了广泛的认可和赞誉。

FDI [Future Designs , Inc.]公司的发展小趣事

为了进一步扩大市场份额,FDI公司开始实施全球化战略。公司先后在欧美、亚洲等地设立了分支机构,并与当地企业建立了紧密的合作关系。同时,FDI还积极参与国际电子展会和论坛,与全球各地的行业精英交流学习。这些举措不仅提升了FDI的品牌影响力,也为其带来了更多的商业机会。

问答坊 | AI 解惑

电路设计是如何确定限流电阻的阻值

各位大虾,在设计电路原理图时,两个集成芯片连接时往往都要串联电阻,而非直接相连,请问这些限流电阻的阻值如何确定?…

查看全部问答>

USB HID 自定义设备之 DS18B20 温度计(转)

转自:点点滴滴版主 http://www.pic16.com/bbs/dispbbs.asp?boardid=8&replyid=172309&id=46618&page=1&skin=0&Star=1 经过将近一个月的闭关。今天终于完成自定义USB HID 免驱动设备。其中由于系统问题,识别出来的HID 设备要驱动程序,害得我浪费 ...…

查看全部问答>

PNG显示

在EVC下,IImage可以对PNG解码,可是为什么透明部分是白色?下面是代码。请问要怎么解决?还有没有其它的方法解决PNG在EVC下的显示问题?     hr = FindResource(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_PNG1), _T(\"PNG\"));  ...…

查看全部问答>

摄象头驱动需要添加哪几个组件??

我wince5.0下执行CamTest2.exe(厂家提供的camer测试程序),弹出如下对话框。 This test program only supports MJPEG stream formats. the driver reports format 5 supported . 请问MJPEG对应在PB下需要添加哪几个组件?? 驱动是厂家提供的 ...…

查看全部问答>

怎么在EVC中修改WINCE的IP地址?

我按照网络上的方法来修改IP地址,为什么老是不行,虽然程序执行成功,该添加的注册表项也添加了,但是为什么老是改不成功呢? 我用的方法如下: HKEY   hkey;      CString   strKeyName  &nbs ...…

查看全部问答>

2440 I2S AD转换问题

请问能够通过I2S音频解码芯片进行ADC转换,再通过I2S接口回传至2440处理器吗?如何操作? 音频芯片AK4554自带I2S接口,以及两路ADC转换,默认ADC一直工作,是否ADC的数据直接送到 了I2S的SDO口?将SDO口接到2440的SDI口,通过寄存器能读出ADC转换 ...…

查看全部问答>

硬件相关的经典资料

硬件相关的经典资料…

查看全部问答>

有没有人用过cycloneⅣ的lvds宏的啊

有没有人用过cycloneⅣ的lvds宏的啊,我现在遇到好几个问题,比如:不管tx_in的位宽是多少,输进去的却总是8位等等。很神奇。求助各位,已经弄了很久了。有用过的大神现身吧,帮帮我,感激不尽。…

查看全部问答>

晒晒获奖来的----【POS机套件】

昨天接到快递员来电,知道是【POS机套件】到了,很高兴,不知道里面有些什么?很期待,到手拆开一看,有很多IC,可怎么也没有找到PCB板,有些失落,看来这套件是让大家自已设计DIY的,觉得很有难度啊,不知有哪位大侠能出来带领大家DIY就好了。收到 ...…

查看全部问答>

帮忙看看用TPS22915B做的这个开关机电路有没有问题

本帖最后由 wgsxsm 于 2015-6-12 10:39 编辑 注:KEY 1,3硬件连接在一起的,请无视那个NC元件。 如上图所示,KEY按下,系统上电,MCU上电后将PWR_ON置高,系统处于开机状态; 长按KEY,通过检测PWR_DEC(平时为低)状态是否为高,持续时间达到3 ...…

查看全部问答>