相对跳转指令:b、bl
bl除跳转外,还将返回值(bl下一条指令的地址)保存在 lr 寄存器中
数据传送指令:mov 地址读取伪指令:ldr
>mov
mov r1 , r2 //r1=r2
mov r1 , #4096 //r1=4096
>ldr
ldr r1,=4097 //r1=4097
内存访问指令:ldr、str、ldm、stm
>ldr 指令从内存中读取数据到寄存器,str 指令把寄存器的值存储到内存中,它们的数据都是32位的
ldr r, [r2, #4] //将地址为 r2+4 的内存单元数据读取到 r1
ldr r, [r2] //将地址为 r2 的内存单元数据读取到 r1
ldr r, [r2], #4 //将地址为 r2 的内存单元数据读取到 r1,然后 r2=r2+4
str r, [r2, #4] //将 r1 的数据保存到地址为 r2+4 的内存单元中
str r, [r2] //将 r1 的数据保存到地址为 r2 的内存单元中
str r, [r2], #4 //将 r1 的数据保存到地址为 r2 的内存单元中,然后r2=r2+4
>ldm 和 stm 是批量内存访问指令,只用一条指令就可以读写多个数据,命令格式为:
ldm {cond} <addressing_mode> <rn>{!} <register list>{^}
stm {cond} <addressing_mode> <rn>{!} <register list>{^}
{cond}:指令执行条件
<addressing_mode>:地址变化模式,包括4种模式
ia:事后递增方式
ib:事先递增方式
da:事后递减方式
db:事先递减方式
<rn>{!} :保存内存到地址,如果后面加上感叹号,指令执行后,rn 的值会更新,等于下一个内存单元的地址
<register list>:表示寄存器列表,对于 ldm ,从<rn>所对应的内存中取出数据,写入这些寄存器;对于 stm,把这些寄存器
的值写入 <rn> 对应的内存块中
{^}:有两种含义:如果 <register list> 中有 pc 寄存器,他表示指令执行后,spsr寄存器的值将自动复制到 cpsr寄存器中——
这常用于从中断函数中返回;如果<register list>中没有 pc 寄存器,{^} 表示操作的是用户模式下的寄存器,而不是当前
特权模式的寄存器
加减指令:add、sub
>add
add r1, r2, #1 //r1 = r2 + 1
>sub
sub r1, r2, #1 //r1 = r2 - 1
程序状态寄存器的访问指令:msr、mrs |