1、寻址方式
(1)指令格式
<指令助记符>{<执行条件>} {S} <目标寄存器>,<操作数1的寄存器> {,<第2操作数>)
注意:
<>号内的项是必需的;(MOV、LDR等)
{ }号内的项是可选的;
S:是否影响CPSR寄存器的值,书写时影响CPSR
CMP不需要增加“s“就可改变相应的标志位
例如:SUBS PC,LR,#4
MOV R0,#0X00
LDR R0,[R1]
所有指令都是32bit(ARM指令),load/store体系结构(对存储器的访问只能使用加载和存储指令实现)
(2) 条件码与机器码
使用指令条件码可实现高效的逐辑操作,提高代码执行效率。
例如:if(a>b)a++; CMP R0,R1
else b++; ADDHI R0,R0,#1
ADDLS R1,R1,#1(LS:小于等于)
注意:CPSR里面的标志位(不用记)对应于条件码助记符(记)
常用的条件码:EQ NE HI LS
机器码:MOV R0,#0×00 <1110 0011 1010 0000000> 0xE3 A0 0000
2、寻址方式(针对源操作效面言)
(1)立即数寻址
MOV RO,10x300
LDX RO,-0X12345678 (伪指令)
注意;8位存效搭,用X表示(0-255),4位存移位的次数,用y表示(0~15),立即数-X循环右移2*Y个位
立即数0XF200是由0XCF2间按表示的,即是由8位的0XF2循环右移24(2*12)得到X=0XF2:Y=0xC
(2)寄存器寻址
MOV R0,R1
(3)寄存器位移寻址
MOV R0,R2,LSL #3(R2左移三位的值赋给R0,LSL是逻辑左移)
(4)寄存器间接寻址 -LDR/STR(load/stroe)
LDR R0,R1
STR R0,R1
LDR和STR指令的数据流的方向相反
(5)基址变址寻址
STR R0,[R1,#-4]
STR R0,[R1,#-4]!(!表示回写)
STR R0,[R1],#-4
(6)多寄存器寻址(Load multiple registers)
STMIA R0!,{R2-R7,R12} 大括号中的内容表示寄存器中的值,R0对应的是存储器上的地址
注意组合:I/D(Increase/Decrease)A/B(After/Before)
(7)堆栈寻址
STMFD SP!,{R1-R3};压栈,寄存器号大的先入栈
LDMED SP!,{R1-R3};出栈
注意组合:F/E I/D
满堆栈:堆栈指针指向最后压入的有效数据项
空堆栈:堆栈指针指向下一个待压入数据的空位置
(8)相对寻址Branch(jmp/cal1)
BBL BLX BX
B跳转指令
BL带返回的跳转指令
BLX带返回和状态切换的跳转指令
BX带状态切换的跳转指令
3、指令分类
(1)数据处理指令:数据传送类,算术逻辑运算类比较指令
数据传送类:
MOV类指令:核内寄存器间的数据传送
加载和存储指令(L/s):核内寄存器与挂在存储器总线上器件的数据传送
注意:核内寄存器:R0、R1... ....
算术逻辑运算类(+,-,*,/,|,~,^)
注意:ARM指令集中没有除法指令,通过软件(移位-比较-相减)实现不过在ARMV7指令集中增加了除法指令
(2)比较指令(cmp tst teq)
CMP R0,#0×01
TST R0,#0×01 //判断R0,最后一位是否为0,与EQ,NE条件码结合使用
TEQ R0,R1 //判断R0,R1是否相等,与EQ,NE条件码结合使用
注意:它们不需要加后缀s,会直接影响程序状态寄存器,常用于选择/循环结构中