微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编指令详解1

ARM汇编指令详解1

时间:11-09 来源:互联网 点击:

存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其它状态和控制信息。CPSR在每种异常模式下都有一个对应的物理寄存器—程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的值,以便异常返回后恢复异常发生时的工作状态。

ARM的寻址方式:

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

立即寻址:操作数本身就在指令中给出。

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

ADDR0,R0,#0x3f;R0 <- R0 + 0x3f

第二个源操作数即为立即数,要求以“#”为前缀。

寄存器寻址:利用寄存器中的数值作为操作数。

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

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

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

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

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

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

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

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

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

多寄存器寻址:一条指令可以完成多个寄存器值的传送。最多实现16个通用寄存器值得传送。

LDMIAR0,{R1,R2,R3,R4}; R1<- [R0]; R2 <- [R0 + 4]; R3<- [R0 + 8]; R4 <- [R0 + 12]

该指令的后缀IA表示在每次执行完加载后,R0按字长增加,因此,指令可将连续存储单元的值传送到R1 -R4。

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

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

......

NEXT

......

MOV PC,LR;从子程序返回

堆栈寻址:堆栈是一种数据结构,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

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

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

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

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

ARM指令集

跳转指令:实现程序流程的跳转,1.使用专门的跳转指令。2.直接向程序计数器PC写入跳转地址值。(跳转之前结合使用 MOV LR,PC.保存将来返回地址值,从而实现在4G连续的线性地址空间的子程序调用。)

指令:B、BL、BLX、BX

B{条件}目标地址

B Label

程序无条件跳转到标号Label处执行

CMPR1,#0

BEQ Label

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

BL{条件} 目标地址

在跳转之前,会在寄存器R14中保存PC当前值。

BLX 目标地址

从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值到PC中来完成。

BX{条件} 目标地址

目标地址可以是ARM指令,也可以是Thumb指令。

B跳转指令

BL带返回的跳转指令

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

BX带状态切换的跳转指令

数据处理指令:数据传送指令、算术逻辑运算指令和比较指令

MOV{条件}{S} 目的寄存器,源操作数

MOV指令完成从另一个寄存器、被移位的寄存器或进一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

MOV R1, R0,LSL#3;将寄存器R0的值左移3位后传送到R1

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

MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

MVNR0,#0xff; R0 <= 0xffffff00

CMP{条件}操作数1,操作数2

CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作数2时,此后的有GT后缀的指令将可以执行。

CMP R1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位

CMPR1,#100; 将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位

TST{条件} 操作数1,操作数2

TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码(掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位),根据测试结果设置相应标志位。当位与

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

网站地图

Top