历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | ARM的栈指令

2019-12-04 来源:eefocus

ARM的栈指令

ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数:

  • 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长的栈称为递减栈(Acendant Stack)

  • 栈指针的指向位置:ARM将栈指针指向栈顶元素位置的栈称为满栈(Full Stack),讲栈指针指向即将入栈的元素位置的栈称为空栈(Empty Stack)

1. 栈类型

根据栈地址增长方向雨栈指针指向位置的不同,自然可以将栈分为四类:


递增栈递减栈
空栈EA栈ED栈
满栈FA栈FD栈

图1描述了四种不同类型的栈,其中虚线部分表示即将入栈的元素。


图1 栈类型

2. 栈指令

栈的操作指令无非两种:入栈和出栈,由于ARM描述了四种不同类型的栈,因此对应的栈指令一共有8条。


入栈出栈
EA栈STMEALDMEA
ED栈STMEDLDMED
FA栈STMFALDMFA
FD栈STMFDLDMFD

这些指令具有相似的前缀:

  • STM:(STore Multiple data)表示存储数据,即入栈。

  • LDM:(LoaD Multiple data)表示加载数据,即出栈。

一般情况下,可以将栈操作指令分解为两步微指令:数据存取和栈指针移动。这两步操作的先后顺序和栈指针的移动方式由栈的类型决定。


第一步第二步等价指令
STMEA写[SP]SP增加STMIA
LDMEASP减少读[SP]LDMDB
STMED写[SP]SP减少STMDA
LDMEDSP增加读[SP]LDMIB
STMFASP增加写[SP]STMIB
LDMFA读[SP]SP减少LDMDA
STMFDSP减少写[SP]STMDB
LDMFD读[SP]SP增加LDMIA

ARM中存在一组缓冲区操作指令和栈指令是一一对应的,他们完成相同的功能。这些指令含义的区别来源于对存取操作的缓冲区指针地址增长方向,以及存取操作和缓冲区指针移动的先后顺序决定的。这个和前面描述的栈类型的分类原则十分相似。


指针递增(Increase)指针递减(Decrease)
存取前移动指针(Before)IBDB
存取后移动指针(After)IADA

3. 使用举例

虽然ARM的栈类型和相关的操作指令比较繁琐,但是实际上最常用的还是和x86指令集相同的栈类型:栈向低地址方向增长,且栈指针指向栈顶元素的位置,即ARM的FD栈。因此最常见的ARM栈指令操作是STMFD和LDMFD。


x86ARM
入栈PUSHSTMFD/STMDB
出栈POPLDMFD/LDMIA

例如入栈指令:

STMFD SP,{R0-R3}

实际的微指令操作为:

[SP-4]  <=  R3[SP-8]  <=  R2[SP-12] <=  R1[SP-16] <=  R0

在ARM的指令系统中,递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作。对于递增栈,相应的操作则全部取反。
例如出栈指令:

LDMFD SP,{R4-R7}

实际的微指令操作为:

[SP]    =>  R4[SP+4]  =>  R5[SP+8]  =>  R6[SP+12] =>  R7

上述的入栈和出栈指令其实仅仅对栈做了存取操作,并未真正改变SP指针的值。正常情况下,我们希望对栈操作后能自动修改栈指针SP的值,使用如下指令可以达到该目的。

STMFD SP!,{R0-R3}

对应的微指令操作为:

[SP-4]  <=  R3[SP-8]  <=  R2[SP-12] <=  R1[SP-16] <=  R0
SP      =  SP - 16

同样的:

LDMFD SP!,{R4-R7}

对应的微指令操作为:

[SP]    =>  R4[SP+4]  =>  R5[SP+8]  =>  R6[SP+12] =>  R7
SP      =  SP + 16

希望通过本文对你理解ARM的栈指令有所帮助。


推荐阅读

史海拾趣

GainSpan ( Telit)公司的发展小趣事

风华的故事始于1984年,当时广东肇庆风华电子厂成立,最初业务聚焦于收录机装配。一年后,即1985年,国内首条从美国引进的年产1亿只片式多层陶瓷电容器生产线落户风华,标志着公司正式踏入高新技术产业领域。这一举措不仅提升了公司的技术实力,也为后续的发展奠定了坚实基础。

Allied Wire & Cable Inc公司的发展小趣事

随着公司业务的不断发展,Allied公司开始积极拓展产品线,逐渐涵盖了多种类型的电线电缆产品,满足了不同客户的需求。同时,公司还积极开拓新的市场领域,将产品推广至全国范围,并逐渐拓展至国际市场。通过不断的产品创新和市场拓展,Allied公司的业务规模逐渐扩大,市场份额也稳步提升。

Floeth Electronic Ltd公司的发展小趣事

面对日益严峻的环境问题,Allied公司积极承担社会责任,致力于可持续发展。公司注重环保生产,采用环保材料和工艺,减少对环境的影响。同时,公司还关注未来发展趋势,制定了一系列战略规划,包括加大研发投入、拓展新兴市场、提升品牌影响力等,为公司的未来发展奠定了坚实的基础。

这些故事基于Allied Wire & Cable Inc公司的历史和发展情况构建,旨在展现其在电子行业中的成长和进步。如需更详细的信息,建议查阅公司的官方网站或相关新闻报道。

DRI Relays Inc公司的发展小趣事

为了满足全球客户的需求,DRI Relays Inc公司开始实施全球化战略。公司先后在亚洲、欧洲和美洲等地设立了分公司和研发中心,以便更好地了解当地市场需求和提供定制化服务。同时,公司还积极参与国际展览和交流活动,加强与全球客户的沟通和合作。这些举措不仅提高了公司的国际知名度,还为公司赢得了更多的订单和市场份额。

AXSEM公司的发展小趣事

随着全球环保意识的提高,DRI Relays Inc公司积极响应环保号召,践行绿色环保理念。公司采用环保材料和节能技术,减少生产过程中的能源消耗和废弃物排放。同时,公司还注重产品的回收和再利用,为客户提供环保解决方案。这些举措不仅提升了公司的社会形象,还为公司带来了更多的商业机会和发展空间。

Applied Engineering Products (AEP)公司的发展小趣事

随着公司规模的扩大和产品种类的增多,AEP公司意识到质量管理的重要性。公司引进了一套先进的质量管理体系,从原材料采购、生产过程到产品出厂,每一个环节都进行严格的质量控制。同时,公司还加强了对员工的培训和管理,确保每一名员工都能严格按照质量标准进行操作。这一举措大大提高了AEP公司的产品质量和客户满意度,为公司的长期发展奠定了坚实基础。

问答坊 | AI 解惑

关于锂电池保护扳设计的问题

锂电池保护扳用在电动车上面的锂电池保护,我用了S-8254IC来控制10串锂电池.但现在有个问题就是我不知道保护芯片S-8254之间级连的方式:Q :Q .望高手赐教.谢谢…

查看全部问答>

MDK中不能使用Goto Definition Goto Reference的解决方法

在用RealView MDK进行嵌入式软件开发的过程中。我们可能需要得知某个变量的类型或者是某个常量的值。或者查找某个函数的原型及其定义。要做到这些有一个最简单的办法就是逐个源文件去查找。或者使用开发工具的文件搜索功能。另外RealView MDK提供了 ...…

查看全部问答>

关于vxworks的嵌入式web开发

现在要在web界面上作ping测试,放置一个按钮,点击按钮后,开始执行ping测试,并将结果输出到一个文本区,请问如何实现?脚本用javascript,javascript如何调用系统API?…

查看全部问答>

和jtag下载方式有关的SOPC中的IP组件问题

为什么SOPC中没有添加和jtag下载有关的组件 但是jtag下载方式却可以用呢 板子上不是也有jtag下载的接口和引脚吗? 为什么SOPC里不需要添加和它相关的组件?…

查看全部问答>

wince啟動,發生dhcp問題..

InitDHCP():: Calling ProcessDHCP() ProcessDHCP()::DHCP_INIT ProcessDHCP()::DHCP_SELECTING::DHCPFindOption() Got DHCP_OFFER without DHCP_SUBN ET_MASK Got Response from DHCP server, IP address: 192.168.1.104 ProcessDHCP()::DHCP ...…

查看全部问答>

一切照旧,不用说再见

哈哈哈,我非常高兴地通知大家,问题已经圆满解决,一切照旧,祝各位学习愉快! ------------------------ 结帖!…

查看全部问答>

双锁相环mc145162的锁定频率怎么写入

本帖最后由 paulhyde 于 2014-9-15 09:32 编辑 最近在做mc145162的PLL,我看了它的pdf,有三个寄存器需要写数据,控制寄存器、参考分频比寄存器,发射接收计数器寄存器,但我不懂怎怎把我要锁定的频率写进去,比如我要锁定35MHz,参考频率设定为5K ...…

查看全部问答>

体验一个全新的RTOS——QNX(基于TI AM3517EVM KIT &beagleboard C4)

       最近两个月来一直在做关于QNX的一些工作,说简单一点就是在AM3517和OMAP3530上跑跑QNX系统,最近比较有时间写一些关于QNX的小东西,分享一下经验,也总结一下自己的工作。由于是用到车上的,就暂且将这个帖子 ...…

查看全部问答>

M4K和onchip memery关系

大小是多少,onchip memery有时不够用                                                 function forumhottag_c ...…

查看全部问答>