Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15097
  • 博文数量: 5
  • 博客积分: 147
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 00:25
文章分类
文章存档

2013年(1)

2012年(4)

我的朋友

分类: 嵌入式

2012-11-07 13:34:06

LDM/STM指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。
    LDM:批量加载,从内存到寄存器
    STM:批量存储,从寄存器到内存
格式如下:
    LDM{cond}<模式> Rn{!},reglist{^}
    STM{cond}<模式> Rn{!},reglist{^}
主要用途:现场保护、数据复制、参数传递
 
模式有8种:(前四种用于数据块传输,后四种是堆栈操作)
(1) IA:每次传送后地址加四
(2) IB:每次传送前地址加四
(3) DA:每次传送后地址减四
(4) DB:每次传送前地址加四
(5) FD:满递减堆栈
(6) ED:空递减堆栈
(7) FA:满递增堆栈
(8) EA:空递减堆栈
 
1、"!"的意思:有"!",每次指令执行后,Rn的值更新。若无,则Rn值不更新。
   "^":不允许在用户模式和系统模式下运行。
   Rn:基址寄存器,传输数据的起始地址,不能为R15.
 
2、ARM编译器默认高寄存器优先存入堆栈,即使指令中安排了入栈顺序,编译器也会打乱从新排列。所以入栈时,高寄存器先入。又因为arm为满递减堆栈,所以,入栈后,高寄存器存放在栈中高地址处,低寄存器存放在栈中低地址处。
 
3、例: STMFD SP!,{R0-R7,LR} 操作如下:
    sp = address;
    sp = sp-4;
    Memory[address] = LR;
    for(i=7;i>0;i--)
    {
        sp = sp-4;
        Memory[address] = Ri;
    }
   例:LDMFD SP!,{R0-R7,PC}^   操作如下:
    address = SP;
    for i = 0 to 7
    Ri = Memory[address,4]
    address = address+4
    SP = address;
   空堆栈入栈后加(减)4,使SP指向下一个要入栈的地址
   满堆栈入栈前减(减)4,使SP指向最后一个入栈的地址
 
4、其实arm处理器核对堆栈向上向下两种增长方式都支持,但是ADS的C编译器仅支持满递减堆栈,所以我们用的最多的指令时LDMFD/STMFD。
 
5、数据传输与堆栈操作对应关系
 
寻址方式
说明
pop
=LDM
push
=STM
FA
递增满
LDMFA
LDMDA
STMFA
STMIB
FD
递减满
LDMFD
LDMIA
STMFD
STMDB
EA
递增空
LDMEA
LDMDB
STMEA
STMIA
ED
递减空
LDMED
LDMIB
STMED
STMDA
 
 
阅读(4066) | 评论(0) | 转发(0) |
0

上一篇:中断处理部分

下一篇:代码复制部分

给主人留下些什么吧!~~