• LDM和STM指令


    LDM批量加载/STM批量存储指令可以实现一组寄存器和一块连续的内存单元之间传输数据

    允许一条指令传送16个寄存器的任意子集和所有寄存器,指令格式如下:
    LDM{cond}  mode  Rn{!}, reglist{^}
    STM{cond}  mode  Rn{!}, reglist{^}
    主要用途:现场保护、数据复制、参数传送等,共有8中模式(前面4种用于数据块的传输,后面4种是堆栈操作)如下:
    (1)IA:每次传送后地址加4
    (2)IB:每次传送前地址加4
    (3)DA:每次传送后地址减4
    (4)DB:每次传送前地址减4
    (5)FD:满递减堆栈
    (6)ED:空递减堆栈
    (7)FA:满递增堆栈
    (8)EA:空递增堆栈
    其中:
    Rn:基址寄存器,装有传送数据的起始地址,Rn不允许为R15;
    !:表示最后的地址写回到Rn中;
    reglist:可包含多于一个寄存器范围,用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大顺序排列;
    ^:不允许在用户模式和系统模式下运行
     
    根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,
    通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:
    STMFD指令的寻址方式为事前递减方式(DB)
     而DB寻址方式实际内存地址为:
     start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)
     end_address = Rn - 4
     STM指令操作的伪代码:
      if ConditionPassed(cond) then
         address = start_address
         for i = 0 to 15
             if register_list[i] == 1
                  Memory[address] = Ri
                  address = address + 4
    有上面两个伪代码可以得出 STMFD SP!,{R0-R7,LR} 的伪代码如下:
       SP = SP - 9×4;
      address = SP; 
     for i = 0 to 7
        Memory[address] = Ri;
        address  = address + 4;
    Memory[address] = LR;
    STMFD和LDMFD指令个人理解分析 - L -
    由于ARM堆栈结构是从高向低压栈的,此时SP即是栈顶。因为处理器是32位的ARM,所以每次压一次栈SP就会移动4个字节(32位)。
    蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址,由此看出STMFD指令是向下压栈的。
     
    LDMFD指令的寻址方式为事后递增方式(IA)
    IA内存的实际地址的伪代码
     start_address = Rn
     end_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4
    LDM指令操作的伪代码(未考虑PC寄存器):
      if ConditionPassed(cond) then
         address = start_address
         for i = 0 to 15
             if register_list[i] == 1
                  Ri = Memory[address,4]
                  address = address + 4
    所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是:
      address = SP;
      for i = 0 to 7
         Ri = Memory[address ,4]
        address = address + 4;
      SP = address;
    STMFD和LDMFD指令个人理解分析 - L -
    蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址。
  • 相关阅读:
    Spring(二):Spring框架&Hello Spring
    Spring(一):eclipse上安装spring开发插件&下载Spring开发包
    MyBatis(三):数据库查询结果不为空,但是使用MyBatis框架查询为空问题
    wrapper x64 版本发布到centos
    Oracle:常用的一些基本操作
    Java:import com.sun.awt.AWTUtilities;报错
    Eclipse中JavaSwing图形插件安装
    Hibernate(五):Hibernate配置文件及C3P0的用法
    Hibernate(四):Hello World
    Hibernate(三): org.hibernate.HibernateException: No CurrentSessionContext configured!
  • 原文地址:https://www.cnblogs.com/getyoulove/p/3672041.html
Copyright © 2020-2023  润新知