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、加法指令

ARM指令系统_数据

 

 第二条指令和第三条指令是等效的

2、BIC指令

执行第一条指令,对R0寄存器进行赋值操作:

ARM指令系统_子程序_02

 

 执行第二条指令,将最低位置零(执行的是与操作),R0寄存器的值发生改变:

ARM指令系统_赋值_03

 

 3、TST指令

ARM指令系统_寻址_04

 

 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、协处理器指令

ARM指令系统_数据_05

 

每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛