首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

SS代表的是堆栈的栈底吗?解决方法

2012-04-07 
SS代表的是堆栈的栈底吗?看到一本书上说,SP总是指向堆栈的栈顶,并且可变化。那么堆栈的栈底用什么来表示??

SS代表的是堆栈的栈底吗?
看到一本书上说,SP总是指向堆栈的栈顶,并且可变化。

那么堆栈的栈底用什么来表示??是不是堆栈值(SP)?如果不是,又是什么?

另外:这本书上还有一句话:堆栈的深度由SP的初值决定。这句话听起来好象说堆栈的深度是固定的,是这样吗?我觉得堆栈的深度是随SP的值不断变化的,



[解决办法]
初始栈顶和栈底应该是同一个值,SP总是指向栈顶,不断变化,堆栈深度可以给定一个大小吧
[解决办法]
在实模式下,SS*4是堆栈段的基地址,程序初始化时,堆栈为空栈(SP被初始化为堆栈的大小,即堆栈的深度),此时栈底等于栈顶。SS:SP始终指向栈底(但只有堆栈为空时,SS:SP既是栈顶又是栈底)。随着压栈操作,SP逐渐减小,SP越来越趋于0。当SP等于0时,SS:SP实际上就是SS:00。
假设SS=1000H,SP=100H(堆栈大小),

基地址:SS*4=10000H(堆栈段的基地址)
栈顶: SS*4+SP=10000H+100H=10100H
栈底: SS*4+堆栈段大小=10000H+100H=10100H

堆栈大小 = 栈底 - 基地址

其实“栈顶”这个名字并不确切。因为如果把堆栈比作水桶的话,栈底相当于桶底,堆栈大小(堆栈深度)相当于水桶的高度(或深度),因此栈顶这个概念应该对应水桶的桶口或桶盖,但是汇编语言中把水桶的水面命名为栈顶,因此基地址就相当于桶口或者桶盖。

桶盖-基地址(即SS*4)
水面-栈顶
桶深-堆栈深度(堆栈大小)
桶底-栈底

程序使用堆栈就如同我们使用水桶盛大饼,先进后出,唯一不同的是,栈顶不等同于桶盖,而是等同于桶中最上面的那张大饼。



[解决办法]
SS指(stack segment 堆栈段),其为sp提供段地址。ss:sp指向一段用户自定义的堆栈空间。

初始化堆栈时sp指向栈底处下一字节的位置(现在栈里面空的,所以也可以说指向栈顶)。

例如:
stack segment
dw 0,0
stack ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,?

这里sp填的是05h,因为前面用了0-4字节。

最后想说一下,SS:SP始终指向的是栈顶!使用栈顶这个名词很贴切,毕竟你把数据压栈了,sp指向的当然是放置数据的内存单元顶部了(堆栈的内存单元是从上往下生长的,这时低字节在上面),如果这时sp指向的是栈底,那么你的栈还是空的,那就没有意义了。
[解决办法]
SS是段直,楼主误解了,SS可以认为是整个栈的范围,应该好好看一下分段机制

热点排行