加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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
    地址为r0+12的存储空间的数据赋值给r4
    例:执行前:
    mem32[0x1000c] = 0x04
    mem32[0x10008] = 0x03
    mem32[0x10004] = 0x02
    mem32[0x10000] = 0x01
    r0 = 0x00010000
    r1 = 0x00000000
    r2 = 0x00000000
    r3 = 0x00000000
    r4 = 0x00000000
    执行后:存储空间不变,寄存器变化
    r0 = 0x00010000
    r1 = 0x01
    r2 = 0x02
    r3 = 0x03
    r4 = 0x04

举例二:
    stmia, 比如当前r0指向的内存地址是 0x1000,stmia r0!,{r1-r7} 就是 首先把r1存入 0x1000,然后r2
    存入0x1004,然后r3存入0x1008,如果是32位的处理器就是每次加4个字节,以此类推把 r1-r7按照递增、
    的地址存入,这个r0!就是从r0的地址开始存的意思。
   
    STMDB则是地址从r0开始减少,依次存储。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有