Chinaunix首页 | 论坛 | 博客
  • 博客访问: 365670
  • 博文数量: 36
  • 博客积分: 2071
  • 博客等级: 大尉
  • 技术积分: 797
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 12:08
文章分类
文章存档

2011年(2)

2010年(34)

我的朋友

分类: 嵌入式

2010-12-02 08:53:55

ARM指令集

ARM指令集概述

ARM七种寻址方式

一、指令系统

 指令是规定计算机进行某种操作的命令

计算机能够执行的各种指令的集合称为指令系统

ARM指令集是32位的,程序的启动都是从ARM指令集开始,所有的ARM指令集都可以是有条件执行的

ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令所对应的不同功能实现的二进制位

当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略

每一条ARM指令包含4位的条件码,位于指令的最高4[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用

例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转

ARM指令集可以分为六大类,分别为:

     数据处理指令、Load/Store指令、跳转指令

     程序状态寄存器处理指令、协处理器指令

     异常产生指令

各指令都按照一定的寻址方式存储数据

目前ARM指令系统支持7种常见的寻址方式

立即数寻址方式

寄存器寻址方式

寄存器间接寻址

基址加变址寻址

多寄存器寻址

相对寻址

堆栈寻址

立即数寻址也叫立即寻址,这是一种特殊的寻址方式

操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址

ADD R0R0,#1       R0R0

ADD R0R0,#0x3f    R0R00x3f 

在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x

寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式

ADD R0R1R2  R0R1R2

该指令的执行效果是将寄存器R1R2的内容相加,其结果存放在寄存器R0

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中

LDR R0[R1] ;    R0[R1] 

指令将以R1的值为地址的存储器中的数据传送到R0

STR R0[R1] ;    [R1]R0 

指令将R0的值传送到以R1的值为地址的存储器中

基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。

变址寻址方式常用于访问某基地址附近的地址单元

LDR R0[R1,#4] R0[R14]

指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0

LDR R0[R1],#R0[R1]R1R14

指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节

LDR R0[R1R2] R0[R1R2] 

指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0

LDR R0[R1,#4];R0[R14]R1R14

指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。

 “!”表明指令在完成数据传送后应该更新基址寄存器

采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。

这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。

LDMIA R0{R1R2R3R4}; 

  R1[R0]R2[R04]R3[R08]R4[R012]

该指令的后缀“IA”表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1R4

与基址变址寻址方式相类似

相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址

以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

      BL NEXT         ;跳转到子程序NEXT处执行 

      ⋯⋯ 

   NEXT: 

        ⋯⋯ 

        MOV PCLR  ;从子程序返回

堆栈是一种数据结构,按先进后出(First In Last OutFILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶

根据进行栈操作时,栈顶指针处的数据情况可分为

当堆栈指针指向最后压入堆栈的数据时,称为满堆栈

当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈

根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈

当堆栈由低地址向高地址生成时,称为递增堆栈

当堆栈由高地址向低地址生成时,称为递减堆栈

ARM微处理器支持这四种类型的堆栈工作方式,即:

   -满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成

   -满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成

   -空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成

   -空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成

阅读(2163) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~