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;