• ARM指令系统


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

  • 相关阅读:
    55.every,filter,forEach,map,some,reduce,slice
    54.get set
    53.一个挺有意思的api(drag)
    52.var,let,const
    iOS18 程序启动过程
    iOS17 加密
    iOS总结2
    iOS16 常用的正则表达式
    iOS15 UIalertController
    iOS14 UIWebView
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12733184.html
Copyright © 2020-2023  润新知