对上文堆栈的补充分析

堆栈的设置
关于堆栈的设置,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寄存器的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值