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可以认为是整个栈的范围,应该好好看一下分段机制