微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编指令ARM寻址方式、汇编指令、伪指令

ARM汇编指令ARM寻址方式、汇编指令、伪指令

时间:11-20 来源:互联网 点击:
1、寻址方式

所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法。

1)立即寻址

立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的。

只要取出指令也就是取得了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即数寻址。

例如:

△:ADD R0,R0,#1;R0<-R0+1

△:ADD R0,R0,#0X3F;R0<-R0+0X3F

2)寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常使用的一种方式,

也是一种执行效率较高的寻址方式。

例程:

ADD R0,R1,R2;R0<-R1+R2

3)寄存器间接寻址

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

例如:

ADD R0,R1,[R2];R0<-R1+[R2]

LDRR0,[R1];R0<-[R1]

4)基址变址寻址

基址变址寻址就是将寄存器(该寄存器一般称为基址寄存器)的内容与指令中给出的地址偏移量相加,

从而得到一个操作数的有效地址:

例如:

LDR R0,[R1,#4];R0<-[R1+4]

LDR R0,[R1,#4]!;R0<-[R1+4]、R1<-R1+4

LDR R0,[R1],#4;R0<-[R1+4]、R1<-R1+4

4)多寄存器寻址

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

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

例如:

LDMIA R0,{R1,R2,R3,R4};R1<-[R0]

;R2<-[R0+4]

;R3<-[R0+8]

;R4<-[R0+12]

注意:该指令的后缀IA表示在每次执行完加载、存储操作后,R0按字长度增加,因此,指令可以将

连续存储单元的值送到R1~R4。

5)相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,

将两者相加之后得到的操作数的有效地址。

例如:

BL NEX

6)堆栈寻址

T堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作为

堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

递增堆栈:向高地址方向生长

递减堆栈:向低地址方向生长

满堆栈:堆栈指针指向最后压入堆栈的有效数据项

空堆栈:堆栈指针指向下一个要放入数据的空位置

2、ARM指令

1)跳转指令

跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:

△:使用专门的跳转指令。

△:直接向程序计数器PC写入跳转地址值,通过向程序计数器PC写入跳转地址值,可以实现在4GB的

地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC

等类似的指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

在ARM指令集中的跳转指令可以完成从当前指令向前或者向后的32MB的地址空间的跳转,包括以下四条指令:

△:B跳转指令

△:BL带返回的跳转至灵

△:BLX带返回和状态切换的跳转指令

△:BX带状态切换的跳转指令

①、B指令:

B{条件}目标地址

B指令是最简单的跳转指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里开始继续执行。

例如:

CMP R1,#0

BEQ LABEL;当CPSR寄存器中的Z条件码置位时,程序跳转到标号LABEL处执行

顺便把指令的条件贴出来:


②、BL指令:

BL{条件}目标地址

BL是另一个跳转指令,但跳转之前,会在寄存器R14(LR)中保存PC当前值,

因此,可以通过将LR的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。

该指令是实现子程序调用的一个基本但常用的手段。

③、BLX指令

BLX 目标地址

BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,

该指令同时将PC的当前内容保存到R14中。

因此,当子程序使用Thumb指令时,而调用者使用ARM指令,可以通过BLX指令实现子程序的调用和处理器

工作状态的切换。

同时,子程序返回可以通过寄存器R14值到PC中来完成返回。

④、BX指令

BX{条件} 目标地址

BX指令跳转到指令中指定的目标地址,目标地址的指令既可以是ARM指令,也可以是Thumb指令。

2、数据处理指令

数据处理指令可以分为数据传送指令、算术逻辑运算指令和比较指令等。

数据传送指令用于在寄存器和寄存器之间(这里一定要看清楚是寄存器与寄存器!!!)进行数据的双向传输。

算术逻辑运算指令完成常用的算术和逻辑的运算,该指令不但将运算结果博爱存在目的寄存器中,同时更新CPSR中的相应条件标志位。

1)MOV指令

MOC{条件}{S}目的寄存器,原操作数(都是寄存器!!!)

MOV指令完成从一个寄存器、被移位的寄存器加载到目的寄存器。

其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

例程:

MOV R1,R0

MOV PC,R14

MOV R1,R0,LSL #3

2)MVN指令

MVN{条件}{S}目的寄存器,原操作数

MVN指令完成从另一个寄存器、被移位的寄存器、或将一个立即数

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top