ARM堆栈方式
实际上“满堆栈”和“空堆栈”确切的说应该是“满栈”或者是“空栈”,我们只是习惯了把栈叫做堆栈。而二者深层的意思是说的“位置”或者“地址”,而不是“堆栈”。如果叫“满位置”或者“空位置”更容易理解一些。下面是《ARM嵌入式系统开发 --软件设计与优化》书中给的解释:
满堆栈(full stack,“F”)是指堆栈指针指向堆栈的最后一个已使用的地址或者满位置(也就是sp指向堆栈最后一个数据项位置)。
空堆栈(empty stack,"E")是指sp指向堆栈的第一个没有使用的地址或者空位置(也就是说sp指向堆栈最后一个数据项的下一个位置)。
满堆栈的关键词是最后一个已使用的地址,空堆栈是第一个没有使用的地址。
存储器堆栈可以分为两种:
一种是向上生长,就是向着高地址方向生长,称为递增堆栈。
一种是向下生长,就是向着低地址方向生长,称为递减堆栈。
这样,就有四种组合:满递增(FA)、空递增(EA)、满递减(FD)、空递减(ED)。
入栈规律:
(1)满堆栈操作先调整SP,然后存入数据。
(2)空堆栈操作先存入数据,然后调整SP。
(3)递增堆栈调整SP时,执行SP=SP+4
(4)递减堆栈调整SP时,执行SP=SP-4
出栈规律正好与入栈相反,也就是入栈的逆操作。
(1)空堆栈操作先调整SP,然后存入数据。
(2)满堆栈操作先存入数据,然后调整SP。
(3)递减堆栈调整SP时,执行SP=SP+4
(4)递增堆栈调整SP时,执行SP=SP-4
明确了这四个规律,就很容易分析各种堆栈寻址方式对应的堆栈分布情况了。
stmfd sp!, {r4-r11}
stmed sp!, {r4-r11}
实际应用中,只选用一种方式使用就可以了。最常用最典型的就是后缀为“FD”时的结构,这是人们熟悉的堆栈结构。
stmfd sp!, {r4-r11, lr}
ldmfd sp!, {r4-r11, lr}
例1:
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080014
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x0008000c
例2
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080010
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080008
ARM堆栈方 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)