电工学习网

 找回密码
 立即注册

ARM指令集

2015-3-23 07:58| 编辑:电工学习网| 查看: 23033| 评论: 0



     ARM协处理器指令——数据存取指令
     协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据读取到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。
     ARM协处理器指令——寄存器传送指令
     如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数据传送,那么可以使用MCR/MRC指令。MCR指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。
     ARM杂项指令——软中断指令
     SWI指令用于产生软中断,从而实现在从户模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。在其它模式下也可使用SWI指令,处理器同样地切换到管理模式。
     该指令主要用于用户程序调用操作系统的系统服务,操作系统在SWI异常处理程序中进行相应的系统服务。

     ARM杂项指令——状态寄存器读指令
     在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。
 

     ARM杂项指令——状态寄存器写指令
     在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
     ARM伪指令
     ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令 一样使用,但在编译时这些指令将被等效的ARM指令代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。
     ARM伪指令——小范围的地址读取
     ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇 编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
     地址表达式expr的取指范围:
     (1)当地址值不是字对齐时,其取指范围为-255~255;
     (2)当地址值是字对齐时,其取指范围为-1020~1020;
     (3)当地址值是16字节对齐时,其取指范围将更大。
     ARM伪指令——中等范围的地址读取
     ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比  ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
     地址表达式expr的取指范围:
     1.当地址值不是字对齐时,其取指范围为-64K~64K;
     2.当地址值是字对齐时,其取指范围为-256K~256K;
     3.当地址值是16字节对齐时,其取指范围将更大。
     ARM伪指令——大范围的地址读取
     LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪 指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。
     注意:
     1.从指令位置到文字池的偏移量必须小于4KB;
     2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。
     ARM伪指令——空操作伪指令
     NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOV R0,R0”指令
     Thumb指令
     Thumb指令集可以看作是ARM指令压缩形式的子集,它是为减小代码量而提出的,具有16位的代码密度。Thumb指令体系不完整,只支持通用功能。必要时仍需要使用ARM指令,如进入异常时。
在这里要说明一下:Thumb指令的格式与使用方式与ARM指令集类似,而且使用并不是很频繁,建议这部分内容选修。
     Thumb指令小节目录
     (1).Thumb指令集与ARM指令集的区别
     (2).存储器访问指令
     (3).数据处理指令
     (4).分支指令
     (5).杂项指令
     (6).伪指令
     下面讲一下Thumb指令集与ARM指令集的区别
     首先说一下,Thumb指令集较ARM指令集有如下限制:
     (1)只有B指令可以条件执行,其它指令都不能条件执行;
     (2)分支指令的跳转范围有更多限制;
     (3)数据处理指令的操作结果必须放入其中一个;
     (4)单寄存器访问指令,只能操作R0~R7;
     (5)LDM和STM指令可以对R0~R7的任何子集进行操作;
     下面讲一下,Thumb存储器访问指令
     LDR和STR——加载/存储指令:
     根据指令的寻址方式不同,可以分为以下三类:(1)立即数偏移寻址;(2)寄存器偏移寻 址;(3)PC或SP相对偏移寻址;
     立即数偏移寻址:以这种寻址方式对存储器访问时,存储器的地址以一个寄存器的内容为基址,在偏移一个立即数后指明。指令格式如下:
     LDR Rd,[Rn,#immed_5×4] ;加载内存中的字数据到寄存器Rd中
     STR Rd,[Rn,#immed_5×4] ;将Rd中的字数据存储到指定地址的内存中
     LDRH Rd,[Rn,#immed_5×2] ;加载内存中的半字数据到寄存器Rd的低16位中
     STRH Rd,[Rn,#immed_5×2] ;存储Rd中的低16位半字数据到指定的内存单元
     LDRB Rd,[Rn,#immed_5×1] ;加载内存中的字节数据到寄存器Rd中
     STRB Rd,[Rn,#immed_5×1] ;存储Rd中的低8位字节数据到指定的内存单元
     其中:Rd 表示加载或存储的寄存器。必须为R0~R7。
     Rn 表示基址寄存器。必须为R0~R7。
     immed_5×N 表示立即数偏移量,其取值范围为(0~31)×N。
     立即数偏移指令编码
     立即数偏移寻址
     应用示例:
     LDR R0,[R1,#0x4]
     STR R3,[R4]
     LDRH R5,[R0,#0x02]
     STRH R1,[R0,#0x08]
     LDRB R3,[R6,#20]
     STRB R1,[R0,#31]
     注意:进行字数据访问时,必须保证传送地址为32位对齐。进行半字数据访问时,必须保证传送地址为16位对齐。
     下面讲一下,寄存器偏移寻址
     这种寻址方式是以一个寄存器的内容为基址,以另一个寄存器的内容为偏移量,两者相加作为存储器的地址。指令格式如下:
     LDR Rd,[Rn,Rm] ;加载一个字数据
     STR Rd,[Rn,Rm] ;存储一个字数据
     LDRH Rd,[Rn,Rm] ;加载一个无符号半字数据
     STRH Rd,[Rn,Rm] ;存储一个无符号半字数据
     LDRB Rd,[Rn,Rm] ;加载一个无符号字节数据
     STRB Rd,[Rn,Rm] ;存储一个无符号字节数据
     LDRSH Rd,[Rn,Rm] ;加载一个有符号半字数据
     LDRSB Rd,[Rn,Rm] ;存储一个有符号半字数据
     其中:Rd 表示加载或存储的寄存器。必须为R0~R7。
     Rn 表示基址寄存器。必须为R0~R7。
     Rm 表示内含数偏移量的寄存器,必须为R0~R7 。
     寄存器偏移指令编码
     寄存器偏移寻址
     应用示例:
     LDR R3,[R1,R0]
     STR R1,[R0,R2]
     LDRH R6,[R0,R1]
     STRH R0,[R4,R5]
     LDRB R2,[R5,R1]
     STRB R1,[R3,R2]
     LDRSH R7,[R6,R3]
     LDRSB R5,[R7,R2]
     注意:进行字数据访问时,必须保证传送地址为32位对齐。进行半字数据访问时,必须保证传送地址为16位对齐。
     相对偏移寻址:这种寻址方式是以PC或SP寄存器的内容为基址,以一个立即数为偏移量,两  者相加作为存储器的地址。指令格式如下:
     LDR Rd,[PC,#immed_8×4]
     LDR Rd,label
     LDR Rd,[SP,#immed_8×4]
     STR Rd,[SP,#immed_8×4]
     其中:Rd 表示加载或存储的寄存器。必须为R0~R7。
     immed_8×4 表示偏移量,取值范围是(0~255)×4 。
     label 表示程序相对偏移表达式,Label必须在当前指令之后的1KB范围内。
     相对偏移指令编码
     相对偏移寻址
     应用示例:
     LDR R0,[PC,#0x08] ;读取PC+0x08地址上的字数据,保存到R0中
     LDR R7,LOCALDAT ;读取LOCALDAT地址上的字数据,保存到R7中LDR R3,[SP,#1020] ; 读取SP+1020地址上的字数据,保存到R3中STR R2,[SP] 存储R2寄存器的数据到SP指向的存储单元 (偏移量为0)
     注意:以PC作为基地址的相对偏移寻址指令只有LDR,而没有STR指令。
     Thumb存储器访问指令
     PUSH和POP——寄存器入栈及出栈指令
     实现低寄存器和可选的LR寄存器入栈及低寄存器和可选的PC寄存器出栈操作。堆栈地址由SP寄存器设置,堆栈是满递减堆栈。
     寄存器入栈及出栈指令
     应用示例:
     PUSH {R0-R7,LR} ;将低寄存器R0~R7全部入栈,LR也入栈POP {R0-R7,PC} ;将堆栈中的数据弹出到低寄存器R0~R7及PC中
     Thumb存储器访问指令
     LDMIA和STMIA——多寄存器加载/存储指令
     可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDMIA为加载多个寄存器;STMIA为存储多个寄存器。使用它们允许一条指令传送8个低寄存器R0~R7的任何子集。
     多寄存器加载/存储指令
     LDMIA/STMIA 的主要用于数据复制、参数传送等。进行数据传送时,每次传送后地址加4。

看过《ARM指令集》的人还看了以下文章:

发表评论

最新评论

  • 嵌入式开发到底是做什么的?
  • FPGA芯片结构
  • FPGA工作原理
  • 嵌入式学习方法与心得
  • 嵌入式软件工程师必须要掌握哪些知识
  • 嵌入式系统开发的可靠性设计

电工学习网 ( )

GMT+8, 2021-12-6 20:44

Powered by © 2011-2021 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

返回顶部