4.ARM指令集

ARM指令集

  • 一、ARM指令格式

    < opcode > {< cond >} {S} < Rd >,< Rn >,< shift_operand >

    <>号内是必须的,{}号内的项是可选的

    • opcode(operation code):指令助记符(操作码),例如,加法(ADD)、减法(SUB)、乘法(MUL)、除法(DIV)等

    • cond(condition)

      • 条件:根据条件是否执行指令(条件码
      • 原理:
        ARM系统中提供了一个专门的寄存器(当前程序状态寄存器)CPSR
        记录当前CPU的运行状态,他的最高的四位会有一个相应的记录
        条件码会去查询CPSR寄存器的最高四位是否满足条件
      • 常用条件:
        • 1、NE(Not Equal):不相等
        • 2、EQ(Equal):相等
        • 3、GT(Greater Than):大于
        • 4、LT(Less Then):小于
        • 5、GE(Greater Equal):大于或者等于
        • 6、LE(Less Equal):小于或者等于
        • 条件码
    • S

      • 表示指令执行的结果,决定是否影响CPSR寄存器的N/Z/C/V值
      • N:Negative(上一条指令结果是否为负数)
      • Z:Zero(上一条指令结果是否为0)
      • C:Carry(无符号算数运算是否进位的情况)
      • V:Overflow(有符号算数运算是否溢出的情况)
      • 包含S则影响,否则不影响
    • Rd(Destination Register)

      • 目标寄存器,主要用于存放计算的结果需要放到哪里去
      • 存放指令执行的结果R0~R15
    • Rn

      • 第1个操作数,必须是—个寄存器,可省略
    • shift_operand

      • 第2个操作数
        • 立即数
          • 一个常数,该常数必须对应8位位图,即—个8位的常数通过循环右移偶数位得到该数,该数为合法立即数
          • mov r1,#100
        • 寄存器 mov r2,r1
        • 寄存器移位(移位指令)
          • 将寄存器值读取之后,进行移位运算后,作为操作数2
          • LSL(Logic Shifter Left):逻辑左移(低位补0)
          • LSR(Logic Shifter Right):逻辑右移(高位补0)
          • 有符号数据左移用逻辑左移代替
          • ASR(Arithmetic Shifter Right):算术右移(正数:低位丢弃,高位补0 负数:低位丢弃,高位补1)
          • 举例:
            • r0,lsr #4表示r0 >> 4
            • r0,lsr r1表示r0 >> r1
            • #3,lsl #4错误,只能是寄存器移位,不能是立即数
  • 二、合法立即数

    • 在ARM 指令中可以使用的立即数必须合法,否则导致ARM指令执行异常

      • 原因
        • ARM 指令长度有限 ,不能都用于表示立即数,所以不能表示所有的立即数,最终会导致部分立即数不能表示
    • 合法立即数规则

      • 如果立即数记做 immediate ,8位常数记做immed_8,4位的循环右移值记做 rotate_imm
        immediate = immed_8循环右移(2*rotate_imm)
      • 所有的立即数必须要通过一个8位立即数通过循环右移偶数位获得,否则为不合法
      • 0x3F0可以通过 0x3F循环右移28位得到,immed_8=0x3F,rotate_imm=0xE
      • 0x0480 0000 可以通过 0x12循环右移10位得到,immed_8=0x12,rotate_imm=0x5
      • 立即数
    • 合法立即数判断

      • 将对应的数转换为32位16进制数 例如:218=0xDA= 0x0000 00DA
      • 1、除零外,仅有一位数 例如:0x0001 0000、0x00f0 0000等
      • 2、除零外,仅有二位数,并且相邻(包括首尾相邻)
      • 3、除零外,仅有三位数,并且相邻(包括首尾相邻)
      • 4、0~255一定是立即数
      • 5、有效数:原数是立即数或者原数反码是立即数(0xFFFFFFFF)
  • 三、数据传送指令

    • MOV

      • 格式:MOV 目标寄存器,操作数2
      • 功能:将操作数2的值赋值给目标寄存器
      • mov r0,#1 @立即数1的值赋值给目标寄存器r0
        mov r1,r0 @寄存器r0的值赋值给目标寄存器r1
        
    • MVN

      • 格式:MVN 目标寄存器,操作数2
      • 功能:对内存中存储的值进行按位取反(~),将操作数2取反的值给目标寄存器
      • mov r0,#1 @立即数1的值赋值给目标寄存器r0
        mvn r1,#0 @立即数0按位取反的值赋值给目标寄存器r1
        
    • LDR(LoaD Register)

      • 格式:LDR 目标寄存器,= 数据(=表示把原始数据给目标寄存器)
      • 功能:将任意数据加载到目标寄存器中
      • ldr r0,=0x1234 @将十六进制数1234加载到目标寄存器r0
        
      • 为什么不用MOV存放到寄存器中?
        • MOV能存放的只有合法立即数
        • LDR可以直接将任意数据加载到寄存器中
  • 四、数据计算指令

    • ADD

      • 格式:ADD 目标寄存器,操作数1,操作数2
      • 功能:加法指令,将操作数1加上操作数2的结果存放在目标寄存器
      • ADD R0,R1,#2  ==>  R0 = R1 + 2
        ADD R0,R1,R2  ==>  R0 = R1 + R2
        ADD R0,R1,R2,LSL #3  ==>  R0 = R1 + R2 << 3
        
    • SUB

      • 格式:SUB 目标寄存器,操作数1,操作数2
      • 功能:减法指令,将操作数1减去操作数2的结果存放在目标寄存器
      • SUB R0,R1,#2  ==>  R0 = R1 - 2
        SUB R0,R1,R2  ==>  R0 = R1 - R2
        SUB R0,R1,R2,LSL #3  ==>  R0 = R1 - R2 << 3
        
    • MUL

      • 格式:MUL 目标寄存器,操作数1,操作数2
      • 功能:乘法指令,将操作数1乘以操作数2的结果存放在目标寄存器
      • 注意:操作数1和操作数2必须都是寄存器,并且操作数1的寄存器编号不能和目标寄存器一样
      • MUL r0,r1,r2
        MUL r0,r1,#3错误,操作数2为立即数
        MUL r0,r0,r1错误,操作数1的寄存器编号和目标寄存器一样
        MUL r0,r1,r0目标寄存器和操作数1 不一样 正确
        
  • 五、比较指令

    • CMP

      • 格式:CMP 寄存器,操作数2
      • CMP会影响CPSR, 也会影响带条件执行的指令的结果
      • 条件码:NE(!=)、EQ(= =)、LT(<)、GT(>)、GE(>=)、LE(<=)
      • mov r0,#10      ==>a = 10;
        mov r1,#20      ==>b = 20;
        mov r2,#30      ==>c = 30;
        cmp r0,r1       ==>if (a > b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值