arm 堆栈操作

arm 支持4种堆栈分别为

1.FD (full decending) 满堆栈递减

2.FA (full ascendng) 满堆栈递增

3.ED (empty desending ) 空堆栈递减

4.EA (empty ascending ) 空堆堆栈的递增

我们很熟悉的X86 堆栈操作,一般是堆栈先指向最后一个有效的数据的低地址

比如 mov esp ,4096,那么就是制定 0 - 4095 作为堆栈空间了,(ss 为0)

(以32位 CPU ,小端模式为例)

那么执行 push 操作的时候就是

esp -= 4;

dword ptr [esp] = xxx;

相对应,pop 就是

xxx = dword ptr [esp] ;

esp += 4;

那么我们再分析arm,哪一种对应我们的熟悉的X86堆栈操作呢,结论是 STMFD/LDMFD

这也是为什么 ARM-THUMB C/C++调用协定默认使用 FD的原因了,

(设计成这种模式,我想这是为了符合大部分使用 X86的人习惯使用ARM的,我猜的,嘿嘿)

注意 ADS 1.2 只支持 FD模式

还有一点要注意,不管如何安排压栈顺序,汇编器总是升序排序,然后从最高的压栈

即:

stmfd sp!,{r0} <==> sp -= 4;

                    str  r0,[sp]

ldmfd sp!,{r0} <==> ldr  r0,[sp]

                    sp += 4

其他的类似,本着够用的原则,在次不多分析

今天看到一个帖子,写的不错,推荐  http://blog.csdn.net/dsgsnb/article/details/5687591

便于记忆区分:

只要记住

满堆栈就是先设置 SP ,再填入数据,而空栈就是 先入栈,再设置SP,(所以SP总是指空,名字也这么起,对吧)

而递增递减是以栈的增长方向来说明的,递增则说明是 低往高长,递减则为高往低长

 

 

 

posted @ 2013-04-24 13:11  moon_cat  Views(457)  Comments(0Edit  收藏