目录
数据处理指令
MOV指令
MOV <Rd> , <shifter_operand>
含义:把 shifter_operand 送到寄存器 Rd
举例:
MOV R0,R1 /*R0=R1*/ MOV R0,R1,LSL#3 /*R0=(R1<<3) */
ADD指令
ADD <Rd> ,<Rn>, <shifter_operand>
含义:Rd=Rn+shifter_operand
举例:
ADD R0,R1,R2 /*R0=R1+R2*/ ADD R0,R1,#256 /*R0=R1+256*/ ADD R0,R2,R3,LSL#1 /*R0=R2+(R3<<1)*/
SUB指令
SUB <Rd>,<Rn>,<shifter_operand>
含义:Rd=Rn-shifter_operand
举例
SUB R0,R1,R2 /*R0=R1-R2*/ SUB R0,R1,#256 /*R0=R1-256*/ SUB R0,R2,R3,LSL#1 /*R0=R2-(R3<<1)*/
MUL指令
MUL <Rd>,<Rm>,<Rs>
含义:32位乘法指令将Rm和Rs中的值相乘,结果的最低32位保存到寄存器Rd中。
举例
MUL R1,R2,R3 /*R1=R2*R3*/
CMP指令
CMP <Rn>,<shifter_operand>
含义:Rn-shifter_operand,进行比较。
CMP R1,#10 /*R1-10,根据相减的结果更新CPSR */ CMP R1,R2 /*R1-R2,根据相减的结果更新CPSR */
ORR逻辑或
ORR <dest>, <op 1>, <op 2>
含义:dest = op_1 OR op_2
举例
ORR R0, R0, #3 /* 使 R0 位0与位1置位*/
BIC指令
BIC <dest>, <op 1>, <op 2>
含义: dest = op_1 AND (!op_2)
功能:置1的位清零
举例
BIC R0, R0, #OXB /* 使 R0 位0、1、3 清零*/
跳转指令
B{L} <target_address>
举例:
B LABLE ADD R1,R2,#4 ADD R3,R2,#8 SUB R3,R3,R1 LABLE: SUB R1,R2,#8
条件执行
ARM指令可以通过添加适当的条件码前缀来达到条件执行的目的
条件码
助记符后缀 | 标志 | 含义 |
EQ | Z 置1 | = |
NE | Z清0 | ≠ |
GT | Z清零(且N=V) | > |
LT | N≠V | < |
GE | N=V | ≥ |
LE | N≠V | ≤ |
程序举例与解析
if(a==0) func(1);
cmp r1,#0 /*r1与0做比较*/
moveq r0,#1 /*如果 r1 = 0 则把 1赋给 r0 */
bleq func /*如果 r1 = 0 跳转至 func 函数*/
func:
if(a==0) x=0;
if(a>0) x=1;
cmp,r0,#0 /* r0 与 0 做比较 */
moveq r1,#0 /* 如果 r0 = 0 把 0 赋给 r1 */
movgt r1,#1 /* 如果 r0 > 0 把 1 赋给 r1*/
if(a==4||a==10) x=0;
cmp r0,#4 /* r0 与 4 作比较 */
cmpne r0,#10 /* 如果 r0 ≠ 4 让 r0 与 10 做比较 */
moveq r1,#0 /* 如果 r0 = 4 或 r0 = 10 将 0 赋给 r1 */