满堆栈(Full Stack,“F”)是指Sp指向堆栈最后一个压入的数据(也就是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

 

例1:

PRE
r1 = 0x00000002
r4 = 0x00000003
sp = 0x00080014

STMFD sp!, {r1, r4}

POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x0008000c

多寄存器的Load和Store指令分为2组:ST(Store), LD(Load)
一组用于数据的存储与读取,对应于IA、IB、DA、DB,
一组用于堆栈操作,对应于FD、ED、FA、EA,两组中对应的指令含义相同
STMIB(地址先增而后完成操作)、STMFA(满递增堆栈); 
STMIA(完成操作而后地址递增)、STMEA(空递增堆栈); 
STMDB(地址先减而后完成操作)、STMFD(满递减堆栈); 
STMDA(完成操作而后地址递减)、STMED(空递减堆栈)。 
上述各组2个指令含义相同只是适用场合不同,同理有: 
LDMIB、LDMED; 
LDMIA、LDMFD; 
LDMDB、LDMEA; 
LDMDA、LDMFA。

 

转载请注明转自: 听风 , 本文固定链接: ARM 堆栈方式