对上文堆栈的补充分析

堆栈的设置
关于堆栈的设置,Codewarrior提供了两种方式:**“STACKSIZE”命令方式和“STACKTOP”命令方式。这两种方式在同一个.prm文件中,不能同时存在。**当用户只关心堆栈的大小而不关心堆栈的存放位置时,推荐使用STACKSIZE方式。 系统默认的方式为使用STACKSIZE方式。
STACKSIZE命令方式:
当使用STACKSIZE命令方式时,如果在PLACEMENT-END部分声明了“SSTACK INTO RAM”,这样的话,堆栈区就被放在RAM区域的起始部分,下面的例子说明了这种方式:

例5
SEGMENTS
„„
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
„„
END

PLACEMENT
„„
SSTACK, PAGED_RAM, DEFAULT_RAM INTO RAM;
„„
END
STACKSIZE 0x100
上面的例子将堆栈区域存放的地址为0x20FF-0x2000,初始的堆栈指针指向栈顶地址0x20FF。
分析:为什么是0x20FF,因为0X2000加上0X100(可以看做0XFF,因为起始地址就是终止地址相当于少一个自己的理解)
相反,如果在PLACEMENT-END部分没有声明“SSTACK INTO RAM”,则堆栈被分配在RAM区域中已分配空间的后面。请参见例6。
例6
SEGMENTS
„„
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
„„
END

PLACEMENT
„„
PAGED_RAM, DEFAULT_RAM INTO RAM;
„„
END STACKSIZE 0x100

在这个例子中,如果RAM区域中已经分配的变量占用了4个字节(从0x2000到0x2003)(每个地址存1个字节的数据,所以四个字节),则堆栈放在这四个字节的后面,从0x2103到0x2004,初始的堆栈指针指向0x2103。
0X2103=0X2004+0X100(0XFF)
STACKYOP命令方式: 当使用STACKTOP命令方式时,如果在PLACEMENT-END部分声明了“SSTACK INTO RAM”,同样,堆栈区就被放在RAM区域的起始部分,初始的栈顶则由STACKTOP指定。若没有相应的声明,则初始的栈顶由STACKTOP指定,而堆栈的大小则根据处理器的不同由编译器自行设定,其大小足够装下处理器的PC寄存器的值。

你可能感兴趣的:(堆栈地址,。prm文件)