在满递减栈中的实现方法:
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》上面说的某个寄存器保存什么值,但你要明白,他们值都保存在栈当中。
阅读(1765) | 评论(0) | 转发(0) |