stmdb和ldmia
(2017-07-22 16:27:05)
stm和ldm:
释义:
stm: (store
much)多数据存储,将寄存器的值存到地址上
ldm: (load
much)多数据加载,将地址上的值加载到寄存器上
格式:
ldm{cond} mode rn{!},
reglist{^}
stm{cond}
mode rn{!}, reglist{^}
详细释义:
arm指令的多数据传输(stm、ldm)中,提到:多寄存器的load和store指令分为2组:
一组用于数据的存储与读取(常用),对应于ia、ib、da、db
一组用于堆栈操作(基本用不到),对应于fd、ed、fa、ea,两组中对应的指令含义相同。
即:
stmib(地址先增而后完成操作)
stmfa(满递增堆栈);
stmia(完成操作而后地址递增)
stmea(空递增堆栈);
stmdb(地址先减而后完成操作)
stmfd(满递减堆栈);
stmda(完成操作而后地址递减)
stmed(空递减堆栈)。
上述各组2个指令含义相同只是适用场合不同,同理有:
ldmib
ldmed;
ldmia
ldmfd;
ldmdb
ldmea;
ldmda
ldmfa。
ia 模式表示:每次传送后地址+4;(after increase)
db 模式表示:每次传送前地址-4;(before decrease)
! :
是选项,可有可无。加此选项,指令执行后,rn 的值会更新,等于下一个内存单元的地址
^ :
如果reglist有pc寄存器,它表示指令执行后,spsr寄存器的值将自动复制到cpsr寄存器中
—— 这常用于从中断处理函数中返回
如果reglis中没有 pc寄存器 , ^ 表示操作的是用户模式下的寄存器,而不是当前特权模式
的寄 存器
stmdb和ldmia:
stmdb和ldmia指令一般配对使用,stmdb用于将寄存器存到某个地址上(一般是栈地址),ldmia用于将地址上
的值加载到寄存器上,作用是保存使用到的寄存器。
举例一: 保存使用到的寄存器。
将寄存器压栈(保存寄存器的值)
指令:stmdb
sp!,{r0-r12,lr}
含义:sp = sp -
4,先压lr,[sp] = lr(即将lr中的内容放入sp所指的内存地址)。sp = sp -
4,再压r12,
[sp] = r12。sp = sp - 4,再压r11,[sp] = r11......sp
= sp - 4,最后压r0,[sp] = r0。
寄存器弹出栈(恢复寄存器的值)
指令:ldmia
sp!,{r0-r12,lr}
含义:r0 =
[sp](sp地址处的值赋值给r0),sp = sp + 4,r1 = [sp],
sp = sp + 4,r2 = [sp], sp = sp + 4,r3 = [sp]......最后lr = [sp]
详细分析:
ldmia
r0!,{r1-r4}
r0:要操作的存储空间首地址,要操作的数据个数由寄存器列表决定,现在是r0到r4,共4个数据(每个数
据32bit)
具体:
地址为r0的存储空间的数据赋值给r1
地址为r0+4的存储空间的数据赋值给r2
地址为r0+8的存储空间的数据赋值给r3
stmdb和ldmia:
stmdb和ldmia指令一般配对使用,stmdb用于将寄存器存到某个地址上(一般是栈地址),ldmia用于将地址上
举例一: 保存使用到的寄存器。