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总是指空,名字也这么起,对吧)
而递增递减是以栈的增长方向来说明的,递增则说明是 低往高长,递减则为高往低长