1、指令分类
(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,会直接影响程序状态寄存器,常用于选择/循环结构中
(3)跳转指令
B BL BX BLX
BX Rn Rn[0]=1(第零位为1) THB状态(在原有的Rn上加1即可)
Rn[0]=0 (第零位为0) ARM状态
实验
1、加法指令
第二条指令和第三条指令是等效的
2、BIC指令
执行第一条指令,对R0寄存器进行赋值操作:
执行第二条指令,将最低位置零(执行的是与操作),R0寄存器的值发生改变:
3、TST指令
4、指令系统、寻址方式代码
AREA RESET,CODE,READONLY ARM ENTRY ;3.1立即数寻址 MOV R0,#0x12;给寄存器传递一个立即数0x12,此时需要用"#"来修饰立即数,其值不能超过255 LDR R0,=0x12;带"="号的是伪指令,将立即数0x12放到寄存器R0中 LDR R0,=0x12345678;伪指令,将立即数0x12345678放到寄存器R0中 ;3.2寄存器寻址 MOV R1,#0x0100 ;给寄存器R1一个立即数0x0100 MOV R0,R1 ;通过寄存器寻址将R1赋值给R0 ;3.3寄存器移位寻址 MOV R1,#0x01 ;给寄存器R1一个立即数0x01 MOV R0,R1,LSL #3 ;R1*8->R0 是0x08 ;3.4寄存器间接寻址(L/S结构)load/store MOV R1,#0x40000000 LDR R0,[R1] ;(R1)-->R0 ;把 {R1} 中的值取出来放入到 R0 中 MOV R1,#0x40000004 STR R0,[R1] ;RO-->R1 ;把 R0 中的值取出来放入到 R1 中 ;3.5基址变址寻址 MOV R0,#0X44 MOV R1,#0x40000010 STR R0,[R1,#-4] ;R1给寄存器R0赋值,再-4 MOV R0,#0X55 STR R0,[R1,#-4]! ;!表示回写 类似i-- MOV R0,#0X66 STR R0,[R1,#-4] ;3.6 多寄存器寻址 MOV R0,#0x40000000 MOV R1,#0x11 MOV R2,#0x22 MOV R3,#0x33 MOV R5,#0x44 STMIA R0!,{R1-R3,R5} ;大括号中的内容表示寄存器中的值,R0对应的是寄存器上的地址 MOV R0,#0x40000004 LDMIA R0!,{R1-R3,R5} ;3.7堆栈寻址 STMFD 压栈,寄存器号大的先入栈;LDMFD 出栈 MOV SP,#0x40000010 MOV R1,#0x01 MOV R2,#0x02 MOV R3,#0x03 MOV R4,#0x04 STMED SP!,{R4,R1-R3} MOV R1,#0x11 MOV R2,#0x22 MOV R3,#0x33 MOV R4,#0x44 STMED SP!,{R4,R1-R3} B L_L1 MOV R1,#0x00 MOV R2,#0x00 L_L1 MOV R3,#0x01 BL FUN ;指令分类,跳转指令(BX) ADR R0,L_L2+1 ;给R0赋值(L_L2) BX R0 ;1110 0001 1111 1111 1111 0000 ->0xe12fff10,跳转到下面的R0 ;CODE16 L_L2 MOV R0,#0x01 MOV R1,#0x01 ADR R0,L_L3 BX R0 CODE32 L_L3 B . ;while(1) FUN MOV R0,#0x00 ;MOV PC,LR ;子程序的返回 BX LR;和上一句的子程序返回的指令的作用是一样的 END B . END
5、协处理器指令