嵌入式Linux 系统开发技术入门详解连载2- ARM处理器B
嵌入式Linux 系统开发技术入门详解连载2-ARM处理器B
2.2 ARM 指令集
2.2.1 ARM微处理器的指令集概述
ARM微处理器的指令集主要有6大类。
· 跳转指令
· 数据处理指令
· 程序状态寄存器(PSR)处理指令
· 加载/存储指令
· 协处理器指令
· 异常产生指令
具体的指令及功能如表2.2 所示(表中指令为基本ARM 指令,不包括派生的ARM指令)。
表 2.2 ARM指令及其功能描述
|
指 令
|
指令功能描述
|
|
ADC
|
带进位加法指令
|
|
ADD
|
加法指令
|
|
AND
|
逻辑与指令
|
|
B
|
跳转指令
|
|
BIC
|
位清零指令
|
|
BL
|
带返回的跳转指令
|
|
BLX
|
带返回和状态切换的跳转指令
|
|
BX
|
带状态切换的跳转指令
|
|
CDP
|
协处理器数据操作指令
|
|
CMN
|
比较反值指令
|
|
CMP
|
比较指令
|
|
EOR
|
异或指令
|
|
LDC
|
存储器到协处理器的数据传输指令
|
|
LDM
|
加载多个寄存器指令
|
|
LDR
|
存储器到寄存器的数据传输指令
|
|
MCR
|
从ARM寄存器到协处理器寄存器的数据传输指令
|
|
MLA
|
乘加运算指令
|
|
MOV
|
数据传送指令
|
|
MRC
|
从协处理器寄存器到ARM寄存器的数据传输指令
|
|
MRS
|
传送CPSR或SPSR的内容到通用寄存器指令
|
|
MSR
|
传送通用寄存器到CPSR或SPSR的指令
|
|
MUL
|
32位乘法指令
|
|
MVF
|
传送值到浮点数寄存器
|
|
MVN
|
数据取反传送指令
|
|
ORR
|
逻辑或指令
|
|
RSB
|
逆向减法指令
|
|
RSC
|
带借位的逆向减法指令
|
|
SBC
|
带借位减法指令
|
|
STC
|
协处理器寄存器写入存储器指令
|
|
STM
|
批量内存字写入指令
|
|
STR
|
寄存器到存储器的数据传输指令
|
|
SUB
|
减法指令
|
|
SWI
|
软件中断指令
|
|
SWP
|
交换指令
|
|
TEQ
|
相等测试指令
|
|
TST
|
位测试指令
|
2.2.2 ARM指令寻址方式
1.立即数寻址
ARM 指令的立即数寻址是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数。
ADD R0,R0,#1 ;R0←R0 + 1
ADD R0,R0,#0x3A ;R0←R0 + 0x3A
在以上2条指令中,第2 个源操作数即为立即数,实际使用时以“#”符号为前缀
2.寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。如以下的指令。
ADD R0,R1,R2 ;R0←R1 + R2
该指令的执行效果是将寄存器R1和R2 的内容相加,其结果存放在寄存器R0中。
3.寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令。
ADD R0,R1,[R2] ;R0←R1 + [R2]
LDR R0,[R1] ;R0←[R1]
在第 1 条指令中,以寄存器R2 的内容作为操作数的地址,然后与R1 相加,其结果存入寄存器R0 中。
第 2 条指令将以R1 的值为地址的存储器中的内容送到寄存器R0 中。
4.基址变址寻址
基址变址的寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。如下面的几条指令所示。
LDR R0,[R1,#0x0A] ;R0←[R1 + 0x0A]
LDR R0,[R1,#0x0A]! ;R0←[R1 + 0x0A]、R1←R1 + 0x0A
在第 1 条指令中,将寄存器R1 的内容加上0x3A形成操作数的有效地址,将该地址处的操作数送到寄存器R0 中。
在第 2 条指令中,将寄存器R1 的内容加上0x0A形成操作数的有效地址,从而取得操作数存入寄存器R0 中,然后,R1 的内容自增0x0A个字节。
5.多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16 个通用寄存器的值。比如下面的指令。
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0]
;R2←[R0 + 4]
;R3←[R0 + 8]
;R4←[R0 + 12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。
6.相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。比如下面的程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式。
BL NEXT ;跳转到子程序NEXT处执行
……
NEXT
……
MOV PC,LR ;从子程序返回
7.堆栈寻址
堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。根据堆栈的生成方式,堆栈又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有4 种类型的堆栈工作方式,ARM微处理器支持以下4种类型的堆栈工作方式。
(1)满递增堆栈:堆栈指针指向最后压入的数据,并且堆栈以递增方式向上生成。
(2)满递减堆栈:堆栈指针指向最后压入的数据,并且堆栈以递减方式向下生成。
(3)空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
(4)空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
2.2.3 Thumb指令概述
作为32 位的嵌入式处理器,ARM 具有32 位数据总线宽度,但是为了更好地兼容数据
总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16 位的Thumb 指令集。Thumb 指令集是ARM 指令集的一个子集,允许指令编码为16 位的长度。与等价的32位代码相比较,Thumb 指令集在保留32 代码优势的同时,可以在很大程度上节省系统的存储空间。当处理器在执行ARM 程序段时,称ARM 处理器处于ARM工作状态;当处理器在执行Thumb 程序段时,称ARM处理器处于Thumb 工作状态。所有的Thumb 指令都有对应的ARM指令,而且Thumb 的编程模型也对应于ARM的编程模型,在应用程序的编写过程中,只要遵循一定调用的规则,Thumb 子程序和ARM 子程序就可以互相调用,二者结合应用可以充分发挥各自的特点,取得较好的效果。发布人信息
- 联系人:wumingwei 查看该用户发布的所有信息
- 电话:
- 邮箱:
- 地址:



