ARM堆栈及特殊指令

发布者:快乐的舞蹈最新更新时间:2017-01-11 来源: eefocus关键字:ARM  堆栈  特殊指令 手机看文章 扫描二维码
随时随地手机看文章

ARM7支持四种堆栈模式:满递减(FD)、满递增(FA)、空递减(ED)、空递增(EA)

FD:堆栈地址从上往下递减,且指针指向最后一个入栈元素。
FA:堆栈地址从下往上递增,且指针指向最后一个入栈元素。
ED:堆栈地址从上往下递减,且指针指向下一个可用空位。
EA:堆栈地址从下网上递增,且指针指向下一个可用空位。

ADSC编译器只支持FD,ucos堆栈模式只能配置递增或递减,关于满和空无法配置。
所以在移植的时候需要改动OSTaskStkInit函数,使其跟中断堆栈操作一致。

arm是risc的机器没有自己的push pop 指令,通常使用stmLDM指令完成压入弹出操作。arm的使用r13=sp ,r14=lR ,r15=pc
  当然在不同的模式下后又不同的影子寄存器,这里的影子是说,他们虽然使用了同样的名称,但是实际的物理地址不是相同的空间,只是认为的做了一些关系的MAP。因为这样可以加速数据的处理。

因为ARM是3级流水线运行,通常运行的指令是Pc-8也就是说运行的指令不是当前的pc指针值。

 

同arm相关的通常是!,S,^这些比较特殊的东西,
  尤其对于LDR指令而言,在使用前偏移地时候就有了!,这同后偏移不同
  前【Rn,Rm,#**】  这种类型是先进行偏移然后加载数据,更具是否!更新Rn
   后【Rn】,Rm,#××这是先加载数据,然后进行偏移,一定更新Rn
  S通常是一个时候更新标志,有时候如果存在PC(r15)加载的话,会作为更新cpsr的选项,
^这个用到的时候通常不多。这也是同cpsr,spsr相关的东西。

 

异常处理部分:
    异常处理是同模式相关的一个概念,ARM有多种异常,对应不同的模式,但是他们之间不是一一对应的关系。
    返回与否?
    有些异常是不需要返回的,reset
    其他的异常通常是需要返回到以前的状态abort,但是不同的异常返回的点是不同的。通常异常的时候会保存下一个指令的地址到R14这样,就需要在返回的时候更具需要进行调整你的PC。
   ,返回后通常执后的下一条指令这样使用 movs就足够了
  abort,就需要返回出现问题的那条指令,也就是【R14】-4了,所以通常使用subs返回。
  批量数据加载/存储指令

ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。常用的加载存储指令如下:

— LDM 批量数据加载指令

— STM 批量数据存储指令

LDM(或STM)指令

LDM(或STM)指令的格式为:

LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}

LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}为以下几种情况:

IA 每次传送后地址加1;

IB 每次传送前地址加1;

DA 每次传送后地址减1;

DB 每次传送前地址减1;

FD 满递减堆栈;

ED 空递减堆栈;

FA 满递增堆栈;

EA 空递增堆栈;

{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

指令示例:

STMFD R13!,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。

LDMFD R13!,{R0,R4-R12,PC};将堆栈内容恢复到寄存器(R0,R4到R12,LR)。

LDR指令的格式为:

LDR{条件} 目的寄存器,<存储器地址>

LDR 指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数 器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请者认真掌握。

指令示例:

LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。

LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDR R0,[R1],R2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDR R0,[R1],R2,LSL#2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

MRS指令的格式为:

MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)

MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况:

-当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。

-当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。

指令示例:

MRS R0,CPSR ;传送CPSR的内容到R0

MRS R0,SPSR ;传送SPSR的内容到R0

2、 MSR指令

MSR指令的格式为:

MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,操作数

MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:

位[31:24]为条件标志位域,用f表示;

位[23:16]为状态位域,用s表示;

位[15:8]为扩展位域,用x表示;

位[7:0]为控制位域,用c表示;

该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。

指令示例:

MSR CPSR,R0 ;传送R0的内容到CPSR

MSR SPSR,R0 ;传送R0的内容到SPSR

MSR CPSR_c,R0;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

ARM微处理器所支持的异常指令有如下两条:

— SWI 软件中断指令

— BKPT 断点中断指令

1、SWI指令

SWI指令的格式为:

SWI{条件} 24位的立即数

SWI 指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序 调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同时,参数 通过其他通用寄存器传递。

指令示例:

SWI 0x02 ;该指令调用操作系统编号位02的系统例程。

2、BKPT指令

BKPT指令的格式为:

BKPT 16位的立即数

BKPT指令产生软件断点中断,可用于程序的调试。3.4Thumb指令及应用

为 兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。Thumb指令 集是ARM指令集的一个子集,允许指令编码为16位的长度。与等价的32位代码相比较,Thumb指令集在保留32代码优势的同时,大大的节省了系统的存 储空间。

所有的Thumb指令都有对应的ARM指令,而且Thumb的编程模型也对应于ARM的编程模型,在应用程序的编写过程中,只要遵 循一定调用的规则,Thumb子程序和ARM子程序就可以互相调用。当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态,当处理器在执行 Thumb程序段时,称ARM处理器处于Thumb工作状态。

与ARM指令集相比较,Thumb指令集中的数据处理指令的操作数仍然是32 位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,如大多数的Thumb指令是无条件执行的,而几乎所 有的ARM指令都是有条件执行的;大多数的Thumb数据处理指令的目的寄存器与其中一个源寄存器相同。

由于Thumb指令的长度为16位,即只用ARM指令一半的位数来实现同样的功能,所以,要实现特定的程序功能,所需的Thumb指令的条数较ARM指令多。在一般的情况下,Thumb指令与ARM指令的时间效率和空间效率关系为:

— Thumb代码所需的存储空间约为ARM代码的60%~70%

— Thumb代码使用的指令数比ARM代码多约30%~40%

— 若使用32位的存储器,ARM代码比Thumb代码快约40%

— 若使用16位的存储器,Thumb代码比ARM代码快约40%~50%

— 与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30%

显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求,则应使用16位的存储系统和Thumb指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。


关键字:ARM  堆栈  特殊指令 引用地址:ARM堆栈及特殊指令

上一篇:ARM 汇编的一些规范
下一篇:函数指针数组在ARM异常中断处理中的应用

推荐阅读最新更新时间:2024-03-16 15:30

服务器芯片战火将起 ARM64位芯片叫板英特尔
据国外媒体报道,英特尔在服务器芯片领域具有绝对的主导地位,服务器芯片占到营收的约20%,提高了其营收的稳定性。但是,未来64位ARM服务器芯片将对英特尔在服务器芯片市场上的地位形成威胁。 ARM VS. 英特尔 投资者应当注意的是,英特尔服务器芯片的原始处理能力高于ARM芯片,原因是英特尔芯片提供一定的硬件定义功能,应用方式更为灵活。 但是,这些硬件功能的实现需要晶体管,ARM芯片没有硬件功能,这也是英特尔芯片晶体管数量是ARM芯片3倍的原因。更多的晶体管数量有助于提高芯片性能,但它们会消耗能源,这也是ARM芯片能源使用效率高于英特尔芯片的原因。 迄今为止,英特尔和AMD是仅有的两家X86架构服务器芯片厂商
[单片机]
ARM处理器工作模式及寄存器结构
一、ARM的指令结构 1、ARM汇编程序组成: 汇编指令+伪操作+宏指令(instruction directive pseudo-instruction); 伪操作:定义符号、数据等使用 宏指令:使用宏定义指令方式 2、汇编指令的组成: 操作码、操作条件(根据CPSR中的N、Z、C、V等标志)、操作数(源、目的/地址或寄存器)、条件、地址变化等等; 3、ARM指令和简化的Thumb指令可以相互跳转 B、BL、BLX、BX带L表示考虑LR寄存器,而X实现不同指令模式的切换; 4、批量操作地址的方式分类 IA、IB、DA、DB A:after B:before I:increment D:
[单片机]
ARM:低功耗与高性能的结合体
几个小时的电池时间几乎是所有笔记本电脑使用者的烦恼。那么你曾经想过会有十几小时甚至更长使用时间的笔记本吗?戴尔不久前推出一款型号为Latitude E6400的“混合”笔记本电脑,宣称具有长达19个小时的电池使用时间,原因是使用了基于ARM的处理器。 生活中见惯了品牌繁杂、形态万千的手机,但你知道目前世界上平均每部新手机上就有2颗ARM处理器吗?其实不光是笔记本、手机,还有汽车、机顶盒等很多与人类生活息息相关的嵌入式应用产品中都会存在一个共同的名字——ARM。 ARM是什么?ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类处理器的通称,还可以认为是一个技术
[嵌入式]
ARM推出全球最高功耗效率的微处理器
ARM近日发布了一款拥有全球最高功耗效率的微处理器——ARM® Cortex™-M0+处理器。该款经过优化的Cortex-M0+处理器可针对 家用电器、白色商品、医疗监控、电子测量、照明设备以及功耗与汽车控制器件等各种广泛应用的智能传感器与智能控制系统,提供超低功耗、低成本微控制器(MCU)。   作为ARM Cortex处理器系列的最新成员,32位Cortex-M0+处理器采用了低成本90纳米低功耗(LP)工艺,耗电量仅9µA/MHz,约为目前主流8位或16位处理器的三分之一,却能提供更高的性能。   这种行业领先的低功耗和高性能的结合为仍在使用8位或16位架构的用户提供了一个转型开发32位器件的理想机会,从而在不牺牲功耗和面积的
[单片机]
基于ARM和GPRS的数据采集传输仪系统设计
0 引言 随着物联网技术的发展,在分散的、环境恶劣的作业点,特别是存在突发、小数据量传输的场合,以有线传输作为通信媒介已不太合适。物联网技术的发展和应用迅速推动了无线通信技术在工业控制领域的发展,无线传感器终端逐渐成为主流。 GPRS是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务。它的出现,使低成本无线传感器网络的构建成为可能,具有资费低、覆盖区域大、实时在线、传输率高、呼叫建立时间短等优势,因此采用GPRS方式设计无线传感器终端的数据采集仪是当今比较好的解决方案。 ARM(Advaneed RISC Machines)微处理器是32位、高性能、廉价、耗能低的RISC处理器。现已广泛应用于多
[单片机]
基于<font color='red'>ARM</font>和GPRS的数据采集传输仪系统设计
Linux下arm裸机开发环境搭建与实例
折腾了很长时间,总算是弄明白怎么在linux编译运行arm裸机程序了。编译运行arm裸机程序可以考虑用arm工具链搭建编译环境,由minicom和dnw来下载程序,至于调试,还没有去耐心研究,着急来这里先备份一下,免得时间久了,忘记怎么回事。 首先是arm工具链,arm工具链的编译我就不写了,一方面很麻烦,另一方面是这方面的资料网上已经有很多了,我就不在这里多言浪费大家时间了。我这里有自己编译的arm工具链,当然,用网上现成的也不是不可以,但是最好是自己熟悉过程,免得必要的时候不会从源码配置。我将工具链上传到空间,如果需要,尽管拿去,链接地址为,使用说明看资源备注: http://download.csdn.net/detail/
[单片机]
基于ARM微处理器的液晶触摸屏的设计
人机交互界面的种类较多,如键盘、数码管显示器、液晶显示器及带触摸的液晶屏等。决定人机交互接口方式的主要因素是成本和实际应用的需要。近十年来,液晶触摸屏以功耗低、重量轻、精度高和良好的人机界面等技术特点, 在电子设备特别是手持类电子产品中得到了普遍应用。带触摸的液晶屏,只要能测量出触摸点的坐标位置,即可根据屏上对应坐标点的显示内容或图符获知触摸者的意图, 通过微处理器处理声音、图像、文字及触摸输入控制等信息,使之成为能进行信息存取、输入和输出的集成系统。基于微控制器与液晶模块的硬件接口设计及软件编程在智能系统设计中有着重要的应用价值。ARM 微处理器,运算速度快、资源丰富、性价比高,是当前较为流行的 嵌入式 控制器。本文介绍的一款基
[单片机]
基于<font color='red'>ARM</font>微处理器的液晶触摸屏的设计
基于ARM核的单电源心电检测模块的实现
本文给出的设计采用单电源供电,可以解决上述问题并降低产品成本,同时该设计还在基于arm核的嵌入式系统中采用了简单实用的算法,能快速准确定位QRS复波(即计算人的心率)。该设计面向广大家庭用户而设计,体积较小,只需要一台个人电脑与之连接,便可实时地操作、观测心电信号。   心电信号采集系统的基本架构如图1所示。人体的心电信号经电极和专用导联线从人体送至系统。通过滤波和放大调节电路,微弱的心电信号被放大到合适的幅值,并处于A/D转换范围之内。 图1:心电信号采集系统的基本架构。   系统的控制和数据的处理由ADI公司基于arm7 TDMI核的MCU ADuC7020来完成。这款芯片有丰富的片内外围电路,处理速度高达40M
[单片机]
基于<font color='red'>ARM</font>核的单电源心电检测模块的实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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