基础常用arm汇编指令

内存访问指令:ldr,str,ldm,stm

ldr( Load from memory into register):

ldr{条件} 目的寄存器 <存储器地址>
作用: 指令从内存中读出数据到寄存器中
比如:
ldr r1, [r2,#4] //将地址r2+4的内存单元的数据读取到r1中
ldr r1,[r2] //将地址r2的内存单元的数据读取到r1中。
R1<——[R2]

注意:ldr中的第二个参数为=时,表示伪指令,或者表示内存访问指令
比如 ldr r1,=4096 ;

str: Store from a register into memory

把指令寄存器的值储存到内存中。
比如:
str r1,[r2,#4] //将r1的数据保存到地址为r2+4的内存单元中
str r1,[r2] //将r1的数据保存到地址为r2的内存单元中
R1——>[R2]

ldm: Load from memory into many register

格式如下:
ldm{cond}<addressing_mode> {!} {^}
<addressing_mode>表示地址变化模式,有以下4中方式
1、ia(increment after):事后递增
2、ib(increment before):事先递增
3、da(decrement after):事后递减
4、db(decrement before):事先递减
!表示执行后,rn的值会更新,等于下一个内存的地址
表示从所对应的内存块中取出数据,写入这些寄存器中。
比如:
ldmia sp, {fp,sp,pc}
sp——>{fp,sp,pc}
即把sp所对应的内存的地址上的数据写入到fp,sp,pc寄存器中。中。执行完之后sp的地址不会更新。

stm: Load from memory into many register

格式如下:
stm{cond}<addressing_mode> {!} {^}
<addressing_mode>表示地址变化模式,有以下4中方式
1、ia(increment after):事后递增
2、ib(increment before):事先递增
3、da(decrement after):事后递减
4、db(decrement before):事先递减
!表示执行后,rn的值会更新,等于下一个内存的地址
表示把寄存器中的值写入到所对应的内存块中。
比如:
stmia sp!, {fp,sp,pc}
sp——>{fp,sp,pc}
把fp,sp,pc所对应的数据写入到sp对应的内存块中,执行完后,sp的地址会更新。
注意:{fp,sp,pc}其中高编号的寄存器存在高地址,与其顺序无关

加减指令:add,sub(subtraction)

add r1,r2, #1 //表示r1 = r2+1,即寄存器r1的值等于寄存器r2的值加1.

sub r1,r2,#1 //表示r1 = r2 -1,即寄存器r1的值等于r2的值减1.

相对跳转指令:b、bl

这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。

这两条指令的跳转范围为当前指令的前后32mb

数据传送指令:mov

MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器

程序状态寄存器的指令:msr,mrs

msr cpsr,r0 //复制r0到cpsr中

mrs r0,cpsr //复制cpsr到r0中

发布了29 篇原创文章 · 获赞 1 · 访问量 558

猜你喜欢

转载自blog.csdn.net/qq_45173769/article/details/103478831