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