ARM汇编指令指令集

ARM伪指令

C与ARM汇编混合编程

 

1、跳转指令

arm一共有两种方法实现程序的跳转:

(1)直接往PC寄存器写值

mov LR,PC

(2)跳转指令

B:跳转指令,不返回

BL:带返回的跳转指令

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

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

(2.1)

B指令的格式:

B{条件} 目标地址  ---》都有哪些条件最好看芯片手册

B指令是最简单的跳转指令。条件可有可无;

B lable  可以实现无条件的跳转

举例:

cmp R1,#0

BEQ lable

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

常用的条件:

 

 (2.2)BL

BL{条件} 目标地址

跳转之前保存PC寄存器中的值到R14寄存器中。因此返回的时候需要程序员手动写代码将R14的值重新放到PC中。

BL lable实现无条件跳转

 

1、数据处理指令

(1)mov指令(实现从一个寄存器,被移位的寄存器或一个立即数加载到目的寄存器)

格式:mov{条件}{S} 目标寄存器,源操作数   (只能在寄存器之间或者寄存器和立即数之间)

S表示是否影响cpsr中的条件标志位的值。有S则更新,没有S就不更新

实例:

mov r1,r0; 寄存器之间的传递值

mov pc,r14

mov r1,r0,LSL#3

问题:mov能从内存从把值加载到寄存器中么?

mov能用寄存器间接寻址么?mov r1, r2+5

 

 

(2)MVN指令---和mov区别是传递之前按位取反,然后在传送到寄存器中。

格式:mov{条件}{S} 目标寄存器,源操作数   (只能在寄存器之间或者寄存器和立即数之间)

S表示是否影响cpsr中的条件标志位的值。有S则更新,没有S就不更新

例如

MVN R0,#0xff ;实际上将0xffffff00这个值放入到R0寄存器中

注意‘#’的含义是什么?‘=’函数又是什么?

 

 

(3)CMP指令

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

作用就是将两个数进行比较,可以是寄存器比较,也可以是立即数比较。比较的结局是改变cpsr寄存器中的值。

例如

CMP R1,R0;将两个寄存器中的值进行比较,并且根据条件改变cpsr中的位值。

如果R0<R1

如果R0>R1

如果R0=R1

参考上面那个表。一般使用CMP后,会有指令根据这个CPSR的值进行其他操作。

例如:

CMP R1,R0;

movhi r0,#1;这个指令会去读cpsr的值,如果无符号数小于,也就是cpsr的C为0,那就把1放到r0中。

movls r1,#3;