数据传送指令
MoV指令
MOV {cond}{s} <Rd>,<operand>
Rd目标寄存器,operand 常数/可用寄存器
例子 MOV R0, #10 ;R0 = 10;对应C语言形式
MOV R0, R1 ;R0 = R1
MVN指令
按位取反指令
MVN R0, #0 ;R0 = ~0
MVN R1,R2 ;R1=~R2
算术指令
ADD指令
ADD {cond}{s} <Rd>, <Rn>, <operand>
Rn通用寄存器
例子 ADD R0, R1, R2 ;R0 = R1+R2
ADD R0, R0, #5 ;R0=R0+5
SUB指令
SUB {cond}{s} <Rd>, <Rn>,<operand>
例子 SUB R0,R1,R2 ;R0 = R1-R2
SUB R0,R0,#5 ;R0=R0-5
SUB R1,R1,R1 ;R1=0
MUL 乘法指令
移位指令
LSL指令
LSL #2 逻辑左移
MOV r0,r1,LSL #2 ;r0=r1*2^2 ,即r0=r1*4 常用于数组寻址,r1作下标
int a[5]; ;*(a+下标*4)
LSR 指令
LSR #2 逻辑右移
MOV r0,r1,LSR #2 ;r0=r1/4
其他不常用移位指令
ASR 指令 算术右移(考虑符号位)
MOVS R0,R1,ASR #1 ;算术右移,第一位符号位不变
ROL/ROR 循环左移循环右移指令
MOV R0,R1,ROR #1 ; 寄存器R1循环右移一位后传送到R0
比较指令
CMP指令
CMP R1 , #10 ; 将寄存器R1的值与10相减,并设置CPSR标志位 //if(R1==10){pass}
跳转指令
B NEXT
...
B是跳转指令
数据存储加载指令
LDR 从内存加载数据到寄存器
LDR {type} {cond} Rd, label{!}
LDRD{cond} Rd,Rd2 ,label{!} (一次加载64位)
{!}是否将寻址结果写入寄存器
type取值 B无符号字节 SB有符号字节 H无符号半字 SH有符号半字
label 位内存地址
寄存器间接寻址
LDR R0, [R1] ; R0 <--[R1] *R1 = [R1] 把以R1的 R0 = * R1 ;以R1寄存器中的数值为内存地址,并把这个内存地址的内容取出都R0寄存器
基址变址寻址
LDR R0, [R1, #4] ; R0<--[R1+4] R0=*(R1+4) #把寄存器的内容和指令中的地址偏移量相加,从而得到一个操作数的有效地址。
LDR R0, [R1, #4]!;R0<--[R1+4],R1<--R1+4
LDR R0,[R1], #4 ;R0<--R1 , R1<--R1+4
LDR R0,[R1,R2] ; R0<--[R1+R2] R0 = *(R1+R2)
STR 将寄存器的值写入内存
STR R0,[R1} //将寄存器R0的值写入内存R1
其他类似指令
字节数据加载/存储指令:LDRB/STRB
半字数据加载/存储指令:LDRH/STRH
有符号数字节/半字加载指令:LDRSB / LDRSH
多寄存器加载和存储指令:
LDM / STM 批量从内存加载数据到寄存器列表/批量从寄存器加载数据都内存
逻辑运算指令
AND指令 逻辑与指令
堆栈操作指令