Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37919
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-05 10:37
文章分类
文章存档

2015年(12)

我的朋友

分类: 嵌入式

2015-06-12 12:55:35

       
    在满递减栈中的实现方法:
    asm (
             " function: \n\t "               |                [栈的高地址-------------------栈的低地址]
             " mov ip, sp \n\t "              |                [入栈顺序:     先进--->后进                 ]
             " push {fp, ip , lr ,pc} \n\t "  |  保存现场  [                      pc  lr ip fp                  ]
             " sub fp, ip, #0x4 \n\t "        |

             ......                                   进入被调函数            
                                                                          [栈的低地址-------------------栈的高地址] 
             " sub sp, fp, #0x12 \n\t "      |                  [出栈顺序:  先出--->后出                  ]
             " ldm sp, {fp, sp, pc} \n\t "   |    恢复现场 [               fp->fp  ip->sp  lr->pc        ]
             :::
             );
总结:
            lr: 保存跳转前的pc值

            ip:保存sp原值,用于恢复sp。
            fp: 保存整个子程序栈的起始地址,对栈的操作,以它为坐标。瞧它的名字帧指针寄存器, 帧,恰当!!!
            sp:分配栈。这儿请注意,一定要分配足够,并且sp要更新,不然, 再调一个子程序时就会把主调函数的栈内容覆盖。 
这样,再也不用计算sp该偏移多少才能找到ip, lr的值。


注意:
        1》除了r15,其余都为通用寄存器,没什么特别的,只是APCS,一种规则,你完全可以用,r5等代替fp。
        有疑问r13,也是通用的吗?必须是,只是APCS规定。
        2》上面说的某个寄存器保存什么值,但你要明白,他们值都保存在栈当中。
阅读(1713) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~