ARM汇编指令ARM寻址方式、汇编指令、伪指令
所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法。
1)立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的。
只要取出指令也就是取得了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即数寻址。
例如:
△:ADD R0,R0,#1
△:ADD R0,R0,#0X3F
2)寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常使用的一种方式,
也是一种执行效率较高的寻址方式。
例程:
ADD R0,R1,R2
3)寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身就放在存储器中。
例如:
ADD R0,R1,[R2]
LDR
4)基址变址寻址
基址变址寻址就是将寄存器(该寄存器一般称为基址寄存器)的内容与指令中给出的地址偏移量相加,
从而得到一个操作数的有效地址:
例如:
LDR R0,[R1,#4]
LDR R0,[R1,#4]!
LDR R0,[R1],#4
4)多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。
这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。
例如:
LDMIA R0,{R1,R2,R3,R4}
注意:该指令的后缀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
顺便把指令的条件贴出来:
②、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指令完成从另一个寄存器、被移位的寄存器、或将一个立即数
ARM汇编指令寻址方式伪指 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)